{"openapi":"3.1.0","info":{"title":"Mengi Cloud","description":"Multi-cloud hosting platform with seamless migration","version":"0.1.0"},"paths":{"/api/v1/auth/providers":{"get":{"tags":["authentication"],"summary":"List Providers","description":"Return which OAuth providers are available for login.","operationId":"list_providers_api_v1_auth_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/{provider}/login":{"get":{"tags":["authentication"],"summary":"Oauth Login","operationId":"oauth_login_api_v1_auth__provider__login_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/{provider}/callback":{"get":{"tags":["authentication"],"summary":"Oauth Callback","operationId":"oauth_callback_api_v1_auth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["authentication"],"summary":"Logout","operationId":"logout_api_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/login":{"post":{"tags":["authentication"],"summary":"Login","description":"Login with email and password","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["authentication"],"summary":"Get Me","operationId":"get_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}}}},"/api/v1/auth/stop-impersonating":{"post":{"tags":["authentication"],"summary":"Stop Impersonating","description":"Restore the admin's original session cookie after impersonation.","operationId":"stop_impersonating_api_v1_auth_stop_impersonating_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/clusters/estimated-times":{"get":{"tags":["clusters"],"summary":"Get Estimated Creation Times","description":"Get estimated cluster creation times based on historical data.\n\nFor shared tier, also returns whether a host cluster is available\nwhich significantly affects creation time.","operationId":"get_estimated_creation_times_api_v1_clusters_estimated_times_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","title":"Tier"}},{"name":"geographic_region","in":"query","required":false,"schema":{"type":"string","title":"Geographic Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters":{"get":{"tags":["clusters"],"summary":"List Clusters","description":"List all clusters for the current user (excludes management and host clusters).\n\nFor shared tier clusters (vClusters), fetches real-time status from ArgoCD\nto ensure the UI always reflects the actual cluster state.","operationId":"list_clusters_api_v1_clusters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterListResponse"}}}}}},"post":{"tags":["clusters"],"summary":"Create Cluster","description":"Create a new Kubernetes cluster.","operationId":"create_cluster_api_v1_clusters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/preflight-import":{"post":{"tags":["clusters"],"summary":"Preflight Import","description":"Inspect a candidate cluster for collisions before importing it.\n\nReturns a list of detected resource collisions (CRDs, IngressClasses,\npre-existing namespaces, etc.) so the caller can decide whether the\nimport is safe to proceed.\n\nRead-only — no DB mutations, no cluster creation.","operationId":"preflight_import_api_v1_clusters_preflight_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/import":{"post":{"tags":["clusters"],"summary":"Import Cluster","description":"Import an existing Kubernetes cluster into Mengi Cloud.\n\nRuns preflight first and refuses the import if any error-severity\nconflicts are detected. Setting ``override_preflight=true`` lets an\nadmin force the import; every override is logged with the user id.","operationId":"import_cluster_api_v1_clusters_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterImport"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}":{"get":{"tags":["clusters"],"summary":"Get Cluster","description":"Get a specific cluster.","operationId":"get_cluster_api_v1_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["clusters"],"summary":"Delete Cluster","description":"Delete a cluster.","operationId":"delete_cluster_api_v1_clusters__cluster_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/kubeconfig":{"get":{"tags":["clusters"],"summary":"Download Cluster Kubeconfig","description":"Download the kubeconfig for a cluster the user administers.\n\nHands out full cluster access, so org clusters require the ADMIN role\n(same gate as autoscaling changes). Management clusters are only\ndownloadable through the platform-admin endpoint.","operationId":"download_cluster_kubeconfig_api_v1_clusters__cluster_id__kubeconfig_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/autoscaling":{"patch":{"tags":["clusters"],"summary":"Update Cluster Autoscaling","description":"Update autoscaling configuration for a cluster.\n\nThis endpoint allows enabling/disabling autoscaling and adjusting\nmin/max node counts. Changes take effect on the next scaling event.\n\nNote: For vClusters (shared tier), autoscaling is managed at the\nhost cluster level, not per-vCluster.","operationId":"update_cluster_autoscaling_api_v1_clusters__cluster_id__autoscaling_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoscalingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/region-locations":{"patch":{"tags":["clusters"],"summary":"Update Cluster Region Locations","description":"Update multi-region locations for a Hetzner production cluster.\n\nChanges which eu-central datacenters worker nodes are distributed across.\nThis triggers a Pulumi update that may recreate servers in new locations.","operationId":"update_cluster_region_locations_api_v1_clusters__cluster_id__region_locations_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionLocationsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/server-type":{"patch":{"tags":["clusters"],"summary":"Update Cluster Server Type","description":"Change a cluster's node machine (server) type in place.\n\nThe worker adds a node pool of the requested type next to the current\none, cordons and drains the old nodes one at a time, then removes the\nold pool. The cluster's control plane and persistent volumes survive and\nworkloads move gradually rather than all at once. This is distinct from\n`tier`, which is immutable and cannot be changed without recreating the\ncluster.","operationId":"update_cluster_server_type_api_v1_clusters__cluster_id__server_type_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/server-type/retry":{"post":{"tags":["clusters"],"summary":"Retry Cluster Server Type","description":"Resume a node-type change that did not complete.\n\nRe-queues the rollover for the cluster's current server type. The\nworker works out which nodes are still on the old type from the nodes\nthemselves and keeps any replacement nodes that already came up, so a\nretry continues where the previous attempt stopped.","operationId":"retry_cluster_server_type_api_v1_clusters__cluster_id__server_type_retry_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/component-bundle":{"patch":{"tags":["clusters"],"summary":"Update Cluster Component Bundle","description":"Update the component bundle channel for a cluster.\n\nThe component bundle determines which version of cluster components\n(cert-manager, traefik, etc.) are deployed via ArgoCD ApplicationSets.\n\nValid values:\n- 'stable': the platform-blessed release (recommended)\n- 'latest': always the newest component versions\n\nThe change is applied by re-stamping the cluster's registration; it\ntakes effect within a few minutes.","operationId":"update_cluster_component_bundle_api_v1_clusters__cluster_id__component_bundle_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/retry":{"post":{"tags":["clusters"],"summary":"Retry Cluster","description":"Retry provisioning a failed cluster with a new region.\nOnly works for clusters in ERROR status.","operationId":"retry_cluster_api_v1_clusters__cluster_id__retry_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterRetry"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/drift-check":{"post":{"tags":["clusters"],"summary":"Check Cluster Drift","description":"Trigger drift detection and correction for a specific cluster.","operationId":"check_cluster_drift_api_v1_clusters__cluster_id__drift_check_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/drift-check-all":{"post":{"tags":["clusters"],"summary":"Check All Clusters Drift","description":"Trigger drift detection and correction for all running clusters.\nThis is an admin operation - typically run via scheduled job.","operationId":"check_all_clusters_drift_api_v1_clusters_drift_check_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/clusters/{cluster_id}/resources":{"get":{"tags":["clusters"],"summary":"List Cluster Resources","description":"List a cluster's Kubernetes resources of one kind (paginated).","operationId":"list_cluster_resources_api_v1_clusters__cluster_id__resources_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"kind","in":"query","required":true,"schema":{"type":"string","description":"Resource kind (nodes, pods, services, deployments, statefulsets, daemonsets, ingresses)","title":"Kind"},"description":"Resource kind (nodes, pods, services, deployments, statefulsets, daemonsets, ingresses)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"include_system","in":"query","required":false,"schema":{"type":"boolean","description":"Include system namespaces","default":false,"title":"Include System"},"description":"Include system namespaces"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/capacity-check":{"post":{"tags":["clusters"],"summary":"Check Cluster Capacity","description":"Tell, before creating or resizing a workload, whether it fits on a\nshared cluster.\n\nShared clusters cap the CPU and memory requests of everything in the\ntenant; a pod over the cap is rejected at admission and ends up as a\nfailed deployment or database. This answers the same question up front\nfrom the tenant's live quota. For dedicated clusters and clusters that\nare not running yet `applies` is false.","operationId":"check_cluster_capacity_api_v1_clusters__cluster_id__capacity_check_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/metrics":{"get":{"tags":["clusters"],"summary":"Get Cluster Metrics","description":"Get real-time metrics for a cluster including node status, resource usage,\nworkloads, and cost information.\n\nWorks for both dedicated clusters and vClusters.","operationId":"get_cluster_metrics_api_v1_clusters__cluster_id__metrics_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/deployment-eta/{provider}/{tier}":{"get":{"tags":["clusters"],"summary":"Get Deployment Eta","description":"Get estimated deployment time for a provider/tier combination.\nReturns average time based on historical data, or defaults if no data available.","operationId":"get_deployment_eta_api_v1_clusters_deployment_eta__provider___tier__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"path","required":true,"schema":{"type":"string","title":"Tier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/upgrades/available":{"get":{"tags":["clusters"],"summary":"Get Available Upgrades","description":"Check if Kubernetes version upgrades are available for this cluster.\nReturns the current version and list of available upgrade versions.","operationId":"get_available_upgrades_api_v1_clusters__cluster_id__upgrades_available_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeAvailableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/upgrades":{"get":{"tags":["clusters"],"summary":"List Upgrade Requests","description":"List all upgrade requests for a cluster.\nReturns upgrade history including pending, completed, and failed upgrades.","operationId":"list_upgrade_requests_api_v1_clusters__cluster_id__upgrades_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpgradeRequestResponse"},"title":"Response List Upgrade Requests Api V1 Clusters  Cluster Id  Upgrades Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/upgrades/request":{"post":{"tags":["clusters"],"summary":"Request Upgrade","description":"Request a Kubernetes version upgrade for the cluster.\nCreates a pending upgrade request that requires approval.","operationId":"request_upgrade_api_v1_clusters__cluster_id__upgrades_request_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/upgrades/{upgrade_id}/approve":{"post":{"tags":["clusters"],"summary":"Approve Upgrade","description":"Approve and start a pending upgrade request.\nThis triggers the actual upgrade process.","operationId":"approve_upgrade_api_v1_clusters__cluster_id__upgrades__upgrade_id__approve_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"upgrade_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/upgrades/{upgrade_id}/cancel":{"post":{"tags":["clusters"],"summary":"Cancel Upgrade","description":"Cancel a pending upgrade request.\nCannot cancel upgrades that are already in progress.","operationId":"cancel_upgrade_api_v1_clusters__cluster_id__upgrades__upgrade_id__cancel_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"upgrade_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/upgrades/{upgrade_id}/trigger-now":{"post":{"tags":["clusters"],"summary":"Trigger Upgrade Now","description":"Trigger immediate execution of a scheduled upgrade.\n\nThis allows users to update their cluster before the scheduled date.\nOnly works for pending upgrades (not already in progress).","operationId":"trigger_upgrade_now_api_v1_clusters__cluster_id__upgrades__upgrade_id__trigger_now_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"upgrade_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/reorder":{"post":{"tags":["clusters"],"summary":"Reorder Clusters","description":"Reorder clusters on the dashboard.\n\nUpdates the display_order for all clusters based on their position\nin the provided cluster_ids list.","operationId":"reorder_clusters_api_v1_clusters_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterReorderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/workloads/discover":{"get":{"tags":["clusters"],"summary":"Discover Cluster Workloads","description":"Discover running workloads in a cluster.\n\nScans the cluster for Helm releases and K8s workloads (Deployments,\nStatefulSets, DaemonSets) and returns them for import selection.\nUsers may only scan imported clusters; the service principal (worker)\nmay scan any cluster, e.g. a migration target after a Velero restore.","operationId":"discover_cluster_workloads_api_v1_clusters__cluster_id__workloads_discover_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only return workloads in this namespace","title":"Namespace"},"description":"Only return workloads in this namespace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveredWorkloadListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/namespaces":{"get":{"tags":["clusters"],"summary":"List Cluster Namespaces","description":"List user namespaces on a cluster (candidates for namespace migration).","operationId":"list_cluster_namespaces_api_v1_clusters__cluster_id__namespaces_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/namespaces/{namespace}/summary":{"get":{"tags":["clusters"],"summary":"Get Cluster Namespace Summary","description":"Summarize a namespace's workloads and PVCs for migration review.","operationId":"get_cluster_namespace_summary_api_v1_clusters__cluster_id__namespaces__namespace__summary_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/dns-credential":{"put":{"tags":["clusters"],"summary":"Set Cluster Dns Credential","description":"Attach a DNS credential to a cluster (or detach with a null id) so the\nper-cluster external-dns manages that credential's domain (BYOC DNS, Phase 3).","operationId":"set_cluster_dns_credential_api_v1_clusters__cluster_id__dns_credential_put","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetClusterDNSCredential"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/inspect-helm-chart":{"post":{"tags":["deployments"],"summary":"Inspect Helm Chart","description":"Inspect a Helm chart and return its metadata and resource requirements.\n\nThis endpoint fetches the chart from the repository, extracts Chart.yaml\nand values.yaml, and returns the chart info including default resource specs.","operationId":"inspect_helm_chart_api_v1_deployments_inspect_helm_chart_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HelmChartInspectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/helm-chart-versions":{"get":{"tags":["deployments"],"summary":"List Helm Chart Versions","description":"List available versions for a Helm chart.","operationId":"list_helm_chart_versions_api_v1_deployments_helm_chart_versions_get","parameters":[{"name":"repo_url","in":"query","required":true,"schema":{"type":"string","title":"Repo Url"}},{"name":"chart_name","in":"query","required":true,"schema":{"type":"string","title":"Chart Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/app-hosting/geographic-regions":{"get":{"tags":["deployments"],"summary":"Get Geographic Regions","description":"Get available geographic regions for shared tier clusters.\nReturns regions based on the selected cloud provider.","operationId":"get_geographic_regions_api_v1_deployments_app_hosting_geographic_regions_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cloud provider (hetzner, aws, gcp, azure). Defaults to hetzner.","title":"Provider"},"description":"Cloud provider (hetzner, aws, gcp, azure). Defaults to hetzner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/app-hosting/kubernetes-versions":{"get":{"tags":["deployments"],"summary":"Get App Hosting Kubernetes Versions","description":"Get supported Kubernetes (k3s) versions for App Hosting shared clusters.\n\nFetches versions from GitHub releases (k3s-io/k3s) with caching.","operationId":"get_app_hosting_kubernetes_versions_api_v1_deployments_app_hosting_kubernetes_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/deployments/app-hosting/availability":{"get":{"tags":["deployments"],"summary":"Check App Hosting Availability","description":"Check if App Hosting is available for the given provider/region.\n\nApp Hosting deployments run on vClusters which require a host cluster.\nThis endpoint checks if a host cluster exists and is ready.","operationId":"check_app_hosting_availability_api_v1_deployments_app_hosting_availability_get","parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"query","required":true,"schema":{"type":"string","title":"Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments":{"get":{"tags":["deployments"],"summary":"List Deployments","operationId":"list_deployments_api_v1_deployments_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"cluster_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cluster Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/DeploymentStatus"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["deployments"],"summary":"Create Deployment","operationId":"create_deployment_api_v1_deployments_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/with-cluster":{"post":{"tags":["deployments"],"summary":"Create Deployment With Cluster","description":"Create a new cluster and deployment in one transaction.","operationId":"create_deployment_with_cluster_api_v1_deployments_with_cluster_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterAndDeploymentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/app-hosting":{"post":{"tags":["deployments"],"summary":"Create App Hosting Deployment","description":"Create a deployment on App Hosting infrastructure.\n\nEach App Hosting deployment gets its own vCluster running on the shared\nhost cluster infrastructure. This provides isolated Kubernetes environments\nwith minimal resource overhead.\n\nThis will:\n1. Pick the best available location for the geographic region\n2. Create a vCluster (tier=SHARED) for this deployment\n3. Trigger app-hosting job to provision vCluster + deploy the app","operationId":"create_app_hosting_deployment_api_v1_deployments_app_hosting_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppHostingDeploymentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}":{"get":{"tags":["deployments"],"summary":"Get Deployment","operationId":"get_deployment_api_v1_deployments__deployment_id__get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["deployments"],"summary":"Update Deployment","description":"Update a deployment's configuration.\n\nChanges will regenerate the values.yaml and queue a worker job to sync to Git,\ntriggering ArgoCD to redeploy with the new configuration.\n\nService principal (X-Service-Token) may update any deployment — internal\ntooling uses this same public endpoint per the dogfood principle (e.g.\nops migrations of env secret_refs).","operationId":"update_deployment_api_v1_deployments__deployment_id__patch","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["deployments"],"summary":"Delete Deployment","operationId":"delete_deployment_api_v1_deployments__deployment_id__delete","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/live-status":{"get":{"tags":["deployments"],"summary":"Get Live Deployment Status","description":"Get real-time ArgoCD status for a deployment.\n\nThis endpoint queries ArgoCD directly for the current application status,\nwhich is more up-to-date than the database status. If the ArgoCD status\ndiffers from the database, it will update the database accordingly.\n\nUse cases:\n- Checking status during PROVISIONING without waiting for hourly sync\n- Getting immediate feedback after deployment changes\n- Debugging deployment issues with real ArgoCD status\n\nReturns:\n    LiveStatusResponse with both DB status and live ArgoCD status","operationId":"get_live_deployment_status_api_v1_deployments__deployment_id__live_status_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/values":{"get":{"tags":["deployments"],"summary":"Get Deployment Values","description":"Get the generated values.yaml for a deployment.","operationId":"get_deployment_values_api_v1_deployments__deployment_id__values_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentValuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/values.yaml":{"get":{"tags":["deployments"],"summary":"Download Deployment Values","description":"Download the values.yaml file directly.","operationId":"download_deployment_values_api_v1_deployments__deployment_id__values_yaml_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/promote":{"post":{"tags":["deployments"],"summary":"Promote Deployment","description":"Promote/migrate a deployment to another cluster.\n\nThis copies the deployment configuration to a new cluster without\nmigrating any state or persistent data. The new deployment will\nstart fresh on the target cluster.\n\nThe promotion is performed asynchronously by the worker. The new\ndeployment is created with PROMOTING status and will transition\nto RUNNING when complete.\n\nUse cases:\n- Shared vCluster → Dedicated cluster (scaling up)\n- Dedicated cluster → Dedicated cluster (region/provider change)\n- Dedicated cluster → Shared vCluster (scaling down for cost savings)","operationId":"promote_deployment_api_v1_deployments__deployment_id__promote_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentPromotionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentPromotionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/import":{"post":{"tags":["deployments"],"summary":"Import Workloads","description":"Import discovered workloads as Mengi deployments.\n\nCreates Deployment records and pushes values to Git with autoSync=false,\nso ArgoCD creates Applications but does not sync them automatically.\nUsers may only import into imported clusters; the service principal\n(worker) may import into any cluster — used after a namespace migration\nto adopt the restored workloads. Service-created deployments are owned\nby the cluster owner.","operationId":"import_workloads_api_v1_deployments_import_post","parameters":[{"name":"cluster_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Cluster ID to import workloads into","title":"Cluster Id"},"description":"Cluster ID to import workloads into"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/subscription":{"get":{"tags":["billing"],"summary":"Get Subscription","operationId":"get_subscription_api_v1_billing_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}}}},"/api/v1/billing/billing-mode":{"patch":{"tags":["billing"],"summary":"Update Billing Mode","description":"Switch between threshold and monthly billing modes.\n\nNew accounts start on threshold billing (collected every €50).  After\n30 days from mandate verification the account may switch to monthly\nbilling (collected once per month).  Switching back to threshold is\nalways allowed.","operationId":"update_billing_mode_api_v1_billing_billing_mode_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingModeUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/status":{"get":{"tags":["billing"],"summary":"Get Billing Status","description":"Get current billing status including mandate verification, credit limit, and usage.\n\nWith ``organization_id`` this returns the organization's billing status\n(requires membership); otherwise the user's personal one.","operationId":"get_billing_status_api_v1_billing_status_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/setup-mandate":{"post":{"tags":["billing"],"summary":"Setup Mandate","description":"Create a verification payment (1 EUR) to set up or update mandate.\nThis verifies the payment method and establishes a mandate for recurring charges.\nCan also be used to update an existing payment method.","operationId":"setup_mandate_api_v1_billing_setup_mandate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/org/{slug}/setup-mandate":{"post":{"tags":["billing"],"summary":"Setup Org Mandate","description":"Set up (or update) the organization's payment mandate. Resources owned by\nthe organization bill this subscription. Requires ADMIN or OWNER.","operationId":"setup_org_mandate_api_v1_billing_org__slug__setup_mandate_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/verify-mandate":{"post":{"tags":["billing"],"summary":"Verify Mandate","description":"Verify mandate status by checking pending payments with Mollie.\nCalled when user returns from payment to handle cases where webhook didn't fire.\nWith ``organization_id`` this verifies the organization's mandate (admin+).","operationId":"verify_mandate_api_v1_billing_verify_mandate_post","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/portal":{"post":{"tags":["billing"],"summary":"Create Portal Session","description":"Redirect to manage subscription.\nMollie doesn't have a built-in portal like Stripe, so we handle this in our own UI.\nFor now, return our billing management page.","operationId":"create_portal_session_api_v1_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalSessionResponse"}}}}}}},"/api/v1/billing/cancel":{"post":{"tags":["billing"],"summary":"Cancel Subscription","description":"Cancel the current subscription.","operationId":"cancel_subscription_api_v1_billing_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/billing/webhook":{"post":{"tags":["billing"],"summary":"Mollie Webhook","description":"Handle Mollie webhooks for payment and subscription updates.\nMollie sends POST with form data containing 'id' of the payment/subscription.\n\nReturns 200 on success, 500 on failure to allow Mollie to retry.\nHandlers must be idempotent to safely handle retries.","operationId":"mollie_webhook_api_v1_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/billing/transactions":{"get":{"tags":["billing"],"summary":"Get Billing Transactions","description":"Get billing transaction history for the active scope: the organization's\nwith ``organization_id`` (requires membership), otherwise the user's own.","operationId":"get_billing_transactions_api_v1_billing_transactions_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingTransactionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/invoices/{invoice_id}/download":{"get":{"tags":["billing"],"summary":"Download Invoice","description":"Download the MoneyBird invoice PDF.\n\nThe PDF is fetched through the MoneyBird API and streamed to the user.\nThe invoice's public MoneyBird URL is deliberately not used: it requires a\nper-invoice access code that MoneyBird only emails to the billing contact,\nwhich other org members don't have.","operationId":"download_invoice_api_v1_billing_invoices__invoice_id__download_get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","title":"Invoice Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/payment-methods":{"get":{"tags":["billing"],"summary":"Get Payment Methods","description":"Get the active payment method (mandate) from Mollie for the active\nscope: the organization's with ``organization_id``, otherwise the user's.","operationId":"get_payment_methods_api_v1_billing_payment_methods_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/billing/payment-method":{"delete":{"tags":["billing"],"summary":"Remove Payment Method","description":"Remove the payment method (revoke all mandates) for the active scope:\nthe organization's with ``organization_id`` (admin+), otherwise the user's.\nOnly allowed when there are no active deployments or clusters in the scope.","operationId":"remove_payment_method_api_v1_billing_payment_method_delete","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me":{"get":{"tags":["users"],"summary":"Get Current User Profile","operationId":"get_current_user_profile_api_v1_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}}},"patch":{"tags":["users"],"summary":"Update Current User","operationId":"update_current_user_api_v1_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/users/me/request-deletion":{"post":{"tags":["users"],"summary":"Request Account Deletion","operationId":"request_account_deletion_api_v1_users_me_request_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/users/me/cancel-deletion":{"post":{"tags":["users"],"summary":"Cancel Account Deletion","operationId":"cancel_account_deletion_api_v1_users_me_cancel_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/providers/products/pricing":{"get":{"tags":["providers"],"summary":"Get Product Pricing","description":"Get the public \"from\" price per cluster product for the landing page.\n\nThe \"from\" price is the platform fee plus the cheapest infrastructure\nbaseline we have pricing for. We use Hetzner as the baseline because\nit's typically the lowest-cost provider in our supported list. The\nactual infrastructure cost a customer pays depends on which provider\nthey pick and is billed separately at the provider's actual rate.\n\nFor the Development (shared) tier there is no infrastructure\npass-through - the host is paid for by Mengi - so the from-price\nequals the platform fee.\n\nProduct mapping:\n- shared       -> Development tier\n- dedicated    -> Dedicated tier\n- dedicatedHa  -> Dedicated HA tier","operationId":"get_product_pricing_api_v1_providers_products_pricing_get","parameters":[{"name":"currency","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SupportedCurrency","description":"Currency for pricing (EUR or USD)","default":"EUR"},"description":"Currency for pricing (EUR or USD)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers":{"get":{"tags":["providers"],"summary":"List Providers","description":"List all supported cloud providers with real-time cluster pricing.\nAll providers use self-managed Kubernetes for consistent, provider-agnostic deployments.","operationId":"list_providers_api_v1_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/providers/pricing":{"get":{"tags":["providers"],"summary":"Get All Pricing","description":"Get detailed cluster pricing for all supported providers.\nReturns control plane costs, node costs, and total monthly estimates.","operationId":"get_all_pricing_api_v1_providers_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/providers/{provider}/regions":{"get":{"tags":["providers"],"summary":"Get Provider Regions","description":"Get available regions for a cloud provider.\nFor Hetzner, optionally check real-time availability with check_availability=true.\nRegions disabled by admins are shown but marked as unavailable with a reason.","operationId":"get_provider_regions_api_v1_providers__provider__regions_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"check_availability","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Check Availability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/server-types":{"get":{"tags":["providers"],"summary":"Get Provider Server Types","description":"Machine types a cluster's worker nodes can be switched to.\n\nLive from the provider where the platform can query it (Hetzner,\nScaleway, DigitalOcean), otherwise from a maintained catalog. Prices\nare indicative monthly EUR per node.","operationId":"get_provider_server_types_api_v1_providers__provider__server_types_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider region; filters to types offered there","title":"Region"},"description":"Provider region; filters to types offered there"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/pricing":{"get":{"tags":["providers"],"summary":"Get Single Provider Pricing","description":"Get detailed cluster pricing for a specific provider.\nOptionally specify a tier for tiered pricing (e.g., testing vs production for Hetzner).","operationId":"get_single_provider_pricing_api_v1_providers__provider__pricing_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cluster tier: testing or production","title":"Tier"},"description":"Cluster tier: testing or production"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/pricing/tiers":{"get":{"tags":["providers"],"summary":"Get Provider Pricing Tiers","description":"Get pricing for all available tiers for a specific provider.\nReturns a list of pricing options (e.g., testing and production for Hetzner).","operationId":"get_provider_pricing_tiers_api_v1_providers__provider__pricing_tiers_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/providers/{provider}/storage-pricing":{"get":{"tags":["providers"],"summary":"Get Storage Pricing","description":"Get current block storage pricing for a provider (dynamically fetched).\n\nPrices are cached for 1 hour and fetched from cloud provider APIs.\nReturns the price per GB per month in EUR.","operationId":"get_storage_pricing_api_v1_providers__provider__storage_pricing_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional region for region-specific pricing","title":"Region"},"description":"Optional region for region-specific pricing"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/analysis/docker-image":{"post":{"tags":["analysis"],"summary":"Analyze Docker Image Endpoint","description":"Analyze a Docker image reference to extract:\n- Image information\n- Suggested ports and volumes\n- Required environment variables\n- Backing services (databases, caches, etc.)\n- 12-factor app compliance analysis\n- Deployment recommendations","operationId":"analyze_docker_image_endpoint_api_v1_analysis_docker_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerImageAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerImageAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/current":{"get":{"tags":["usage"],"summary":"Get Current Usage","description":"Get current usage and cost estimate for the authenticated user.","operationId":"get_current_usage_api_v1_usage_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentUsageResponse"}}}}}}},"/api/v1/usage/summary":{"get":{"tags":["usage"],"summary":"Get Usage Summary","description":"Get usage summary for the specified period.","operationId":"get_usage_summary_api_v1_usage_summary_get","parameters":[{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Period Days"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/usage/history":{"get":{"tags":["usage"],"summary":"Get Usage History","description":"Get detailed usage history records.","operationId":"get_usage_history_api_v1_usage_history_get","parameters":[{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Period Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"List all API keys for the current user.","operationId":"list_api_keys_api_v1_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyListResponse"}}}}}},"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Create a new API key.\n\nThe full API key is only returned once in this response.\nStore it securely - you won't be able to see it again.","operationId":"create_api_key_api_v1_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys/{key_id}":{"get":{"tags":["api-keys"],"summary":"Get Api Key","description":"Get details of a specific API key.","operationId":"get_api_key_api_v1_api_keys__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Revoke (deactivate) an API key.\n\nThe key will no longer be usable for authentication.\nThis action cannot be undone.","operationId":"revoke_api_key_api_v1_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-keys"],"summary":"Update Api Key","description":"Update an API key's name or description.","operationId":"update_api_key_api_v1_api_keys__key_id__patch","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/connected-applications":{"get":{"tags":["connected-applications"],"summary":"List Connected Applications","description":"List applications you have authorized to access your account.","operationId":"list_connected_applications_api_v1_connected_applications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAppListResponse"}}}}}}},"/api/v1/connected-applications/{client_id}":{"delete":{"tags":["connected-applications"],"summary":"Revoke Connected Application","description":"Revoke an application's access. Takes effect immediately.","operationId":"revoke_connected_application_api_v1_connected_applications__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets":{"post":{"tags":["secrets"],"summary":"Create Secret","description":"Create a new secret.\n\nThe secret is stored in OpenBao - nothing is stored in our database.","operationId":"create_secret_api_v1_secrets_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["secrets"],"summary":"List Secrets","description":"List secrets in the active organization's namespace (defaults to the user's\npersonal org). If deployment_id is provided, the deployment's org namespace\nis listed and the result contains the secrets that deployment can consume:\nits own deployment-scoped secrets plus the org-wide (unscoped) ones. Other\ndeployments' scoped secrets are excluded.","operationId":"list_secrets_api_v1_secrets_get","parameters":[{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deployment Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets/{secret_name}/value":{"get":{"tags":["secrets"],"summary":"Get Secret Value","description":"Get a secret's value from OpenBao.\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"get_secret_value_api_v1_secrets__secret_name__value_get","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretValueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets/{secret_name}":{"get":{"tags":["secrets"],"summary":"Get Secret","description":"Get details of a specific secret by name (value is never returned).\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"get_secret_api_v1_secrets__secret_name__get","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["secrets"],"summary":"Delete Secret","description":"Delete a secret from OpenBao.\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"delete_secret_api_v1_secrets__secret_name__delete","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["secrets"],"summary":"Update Secret","description":"Update a secret's value in OpenBao.\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"update_secret_api_v1_secrets__secret_name__put","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/secrets/{secret_name}/transfer":{"post":{"tags":["secrets"],"summary":"Transfer Secret","description":"Move a secret from the active org's namespace to another org's namespace.\n\n`organization_id` (or the deployment's org) is the source; the caller must be\na member of both source and target orgs. The OpenBao value is copied to the\ntarget namespace and deleted from the source.","operationId":"transfer_secret_api_v1_secrets__secret_name__transfer_post","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretTransferRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations":{"get":{"tags":["organizations"],"summary":"List Organizations","description":"List all organizations the current user is a member of.","operationId":"list_organizations_api_v1_organizations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationListResponse"}}}}}},"post":{"tags":["organizations"],"summary":"Create Organization","description":"Create a new organization.","operationId":"create_organization_api_v1_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}":{"get":{"tags":["organizations"],"summary":"Get Organization","description":"Get organization details by slug.","operationId":"get_organization_api_v1_organizations__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["organizations"],"summary":"Update Organization","description":"Update organization details.","operationId":"update_organization_api_v1_organizations__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Delete Organization","description":"Delete an organization (owner only).\n\nRefuses while the organization still owns clusters, deployments, databases\nor secrets, and while it has an unpaid balance or a payment being collected\n(platform admins can pass ?force=true to write the balance off). Its cloud\nand DNS credentials are deleted with it, secrets included.","operationId":"delete_organization_api_v1_organizations__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Platform admins only: delete despite a billing hold (the unpaid balance is written off)","default":false,"title":"Force"},"description":"Platform admins only: delete despite a billing hold (the unpaid balance is written off)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/members":{"post":{"tags":["organizations"],"summary":"Add Member","description":"Add a member to the organization.","operationId":"add_member_api_v1_organizations__slug__members_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/invite":{"post":{"tags":["organizations"],"summary":"Invite Member","description":"Invite a member to the organization by email.","operationId":"invite_member_api_v1_organizations__slug__invite_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberInvite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/members/{user_id}":{"patch":{"tags":["organizations"],"summary":"Update Member","description":"Update a member's role.","operationId":"update_member_api_v1_organizations__slug__members__user_id__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Remove Member","description":"Remove a member from the organization.","operationId":"remove_member_api_v1_organizations__slug__members__user_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/transfer-trial-credit":{"post":{"tags":["organizations"],"summary":"Transfer Trial Credit","description":"Move the caller's remaining personal trial credit to this organization.\n\nCampaign (QR) trial credit lands on the personal account; this lets an\nADMIN/OWNER of a team organization bring it along. Refused (409) when the\norganization already has trial credit or a payment method, or when the\npersonal workspace still owns billable resources.","operationId":"transfer_trial_credit_api_v1_organizations__slug__transfer_trial_credit_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{slug}/transfer-resource":{"post":{"tags":["organizations"],"summary":"Transfer Resource","description":"Transfer a resource to this organization.\n\nThe caller must be an ADMIN/OWNER of both the resource's current organization\nand the target organization. Transferring a cluster cascades to everything it\nowns (deployments, databases, and their secrets) so the org-inheritance\ninvariant is preserved.","operationId":"transfer_resource_api_v1_organizations__slug__transfer_resource_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/kubernetes/{provider}":{"get":{"tags":["versions"],"summary":"Get Kubernetes Versions","description":"Get supported Kubernetes versions for a provider.\n\nFetches versions from cloud provider APIs with 1-hour caching.\nReturns a list of versions sorted by recommendation order (default first).","operationId":"get_kubernetes_versions_api_v1_versions_kubernetes__provider__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"cluster_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by cluster type: managed, rke2, k3k","title":"Cluster Type"},"description":"Filter by cluster type: managed, rke2, k3k"},{"name":"include_deprecated","in":"query","required":false,"schema":{"type":"boolean","description":"Include deprecated versions","default":false,"title":"Include Deprecated"},"description":"Include deprecated versions"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesVersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/kubernetes/{provider}/default":{"get":{"tags":["versions"],"summary":"Get Default Kubernetes Version","description":"Get the default Kubernetes version for a provider.","operationId":"get_default_kubernetes_version_api_v1_versions_kubernetes__provider__default_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"cluster_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by cluster type","title":"Cluster Type"},"description":"Filter by cluster type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/kubernetes/k3k":{"get":{"tags":["versions"],"summary":"Get K3K Versions","description":"Get supported k3s versions for k3k cluster deployments.\n\nFetches versions from k3s GitHub releases with 1-hour caching.","operationId":"get_k3k_versions_api_v1_versions_kubernetes_k3k_get","parameters":[{"name":"include_deprecated","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deprecated"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesVersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/bundles":{"get":{"tags":["versions"],"summary":"List Component Bundles","description":"Get available component bundles from GitLab tags.\n\nComponent bundles are git tags in the mengi-cluster-apps repository.\nThis endpoint queries GitLab API and caches results for 5 minutes.","operationId":"list_component_bundles_api_v1_versions_bundles_get","parameters":[{"name":"stable_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return stable bundles","default":false,"title":"Stable Only"},"description":"Only return stable bundles"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/bundles/stable":{"get":{"tags":["versions"],"summary":"Get Stable Bundle Endpoint","description":"Get the current stable component bundle.\n\nReturns the highest semver tag without prerelease suffix.","operationId":"get_stable_bundle_endpoint_api_v1_versions_bundles_stable_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleResponse"}}}}}}},"/api/v1/versions/bundles/{version}":{"get":{"tags":["versions"],"summary":"Get Component Bundle","description":"Get details for a specific component bundle version.","operationId":"get_component_bundle_api_v1_versions_bundles__version__get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/versions/bundles-excluded":{"get":{"tags":["versions"],"summary":"Get Excluded Components Endpoint","description":"Get list of components excluded from user-facing bundle views.\n\nThese components are only deployed to management or host clusters,\ndetermined by parsing ApplicationSet selector labels from GitLab.\nResults are cached for 5 minutes.","operationId":"get_excluded_components_endpoint_api_v1_versions_bundles_excluded_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExcludedComponentsResponse"}}}}}}},"/api/v1/cloud-credentials":{"get":{"tags":["cloud-credentials"],"summary":"List Cloud Credentials","description":"List all cloud credentials for the current user.","operationId":"list_cloud_credentials_api_v1_cloud_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudCredentialListResponse"}}}}}},"post":{"tags":["cloud-credentials"],"summary":"Create Cloud Credential","description":"Create a new cloud credential.\n\nCredentials are stored securely in OpenBao, not in our database.\nAfter creation, credentials should be validated using the validate endpoint.","operationId":"create_cloud_credential_api_v1_cloud_credentials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudCredentialCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cloud-credentials/{credential_id}":{"get":{"tags":["cloud-credentials"],"summary":"Get Cloud Credential","description":"Get a specific cloud credential by ID.","operationId":"get_cloud_credential_api_v1_cloud_credentials__credential_id__get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["cloud-credentials"],"summary":"Delete Cloud Credential","description":"Delete a cloud credential.\n\nThis will fail if any clusters are using this credential.","operationId":"delete_cloud_credential_api_v1_cloud_credentials__credential_id__delete","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cloud-credentials/{credential_id}/validate":{"post":{"tags":["cloud-credentials"],"summary":"Validate Cloud Credential","description":"Validate a cloud credential by testing it against the provider's API.\n\nThis performs a lightweight API call to verify the credentials work.","operationId":"validate_cloud_credential_api_v1_cloud_credentials__credential_id__validate_post","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CloudCredentialValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/cloud-credentials/{credential_id}/clusters":{"get":{"tags":["cloud-credentials"],"summary":"Discover Clusters","description":"Discover existing Kubernetes clusters using stored cloud credentials.\n\nReturns a list of clusters from the provider API.\nHetzner/Scaleway return empty lists (no managed K8s - user must paste kubeconfig).","operationId":"discover_clusters_api_v1_cloud_credentials__credential_id__clusters_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/credentials":{"get":{"tags":["registry"],"summary":"Get Registry Credentials","description":"Get the active organization's registry credentials.\n\nReturns credential metadata without the actual token password.","operationId":"get_registry_credentials_api_v1_registry_credentials_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentialStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["registry"],"summary":"Create Registry Credentials","description":"Generate new registry credentials for the active organization.\n\nCreates a Harbor project and robot account. The robot secret is only\nreturned once - save it immediately!","operationId":"create_registry_credentials_api_v1_registry_credentials_post","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentialCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["registry"],"summary":"Delete Registry Credentials","description":"Revoke and delete the organization's registry credentials.\n\nThis will:\n- Revoke the robot account in Harbor\n- Mark the credential as inactive","operationId":"delete_registry_credentials_api_v1_registry_credentials_delete","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/images":{"get":{"tags":["registry"],"summary":"List Registry Images","description":"List repositories (images and Helm charts) in the organization's Harbor\nregistry project. Each entry carries its artifact_type.\n\nReturns an empty list if the organization has no registry credentials.","operationId":"list_registry_images_api_v1_registry_images_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegistryRepositoryResponse"},"title":"Response List Registry Images Api V1 Registry Images Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/images/{repository_name}/tags":{"get":{"tags":["registry"],"summary":"List Registry Image Tags","description":"List tags for a repository in the organization's Harbor registry project.\n\nReturns 404 if the organization has no registry credentials.","operationId":"list_registry_image_tags_api_v1_registry_images__repository_name__tags_get","parameters":[{"name":"repository_name","in":"path","required":true,"schema":{"type":"string","title":"Repository Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegistryTagResponse"},"title":"Response List Registry Image Tags Api V1 Registry Images  Repository Name  Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/images/{repository_name}":{"delete":{"tags":["registry"],"summary":"Delete Registry Repository","description":"Delete an entire repository from the organization's Harbor registry project.","operationId":"delete_registry_repository_api_v1_registry_images__repository_name__delete","parameters":[{"name":"repository_name","in":"path","required":true,"schema":{"type":"string","title":"Repository Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/images/{repository_name}/tags/{tag_name}":{"delete":{"tags":["registry"],"summary":"Delete Registry Image Tag","description":"Delete a specific tag from a repository in the organization's Harbor registry project.","operationId":"delete_registry_image_tag_api_v1_registry_images__repository_name__tags__tag_name__delete","parameters":[{"name":"repository_name","in":"path","required":true,"schema":{"type":"string","title":"Repository Name"}},{"name":"tag_name","in":"path","required":true,"schema":{"type":"string","title":"Tag Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/registry/credentials/regenerate":{"post":{"tags":["registry"],"summary":"Regenerate Registry Credentials","description":"Regenerate the organization's registry credentials.\n\nThis will revoke the existing robot account and create a new one.\nThe new robot secret is only returned once - save it immediately!","operationId":"regenerate_registry_credentials_api_v1_registry_credentials_regenerate_post","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentialCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/contact":{"post":{"tags":["contact"],"summary":"Send Contact Message","description":"Send a contact message to the Mengi Cloud team.\n\nThis endpoint is public and does not require authentication.","operationId":"send_contact_message_api_v1_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invitations/{token}":{"get":{"tags":["invitations"],"summary":"Get Invitation Preview","description":"Public preview of an invitation, shown before signup/login.\n\nUnknown and revoked tokens both return 404 so outsiders can't probe\nwhich tokens ever existed.","operationId":"get_invitation_preview_api_v1_invitations__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/invitations/{token}/accept":{"post":{"tags":["invitations"],"summary":"Accept","description":"Accept an invitation as the signed-in user.\n\nThe signed-in email must match the invited address (case-insensitive).\nCreates the organization (with its trial subscription, if any) for\nnew-org invitations.","operationId":"accept_api_v1_invitations__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/campaigns/{code}":{"get":{"tags":["campaigns"],"summary":"Get Campaign Preview","description":"Public preview of a campaign, shown on the QR landing page.\n\nUnknown and revoked codes both return 404.","operationId":"get_campaign_preview_api_v1_campaigns__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/campaigns/{code}/redeem":{"post":{"tags":["campaigns"],"summary":"Redeem","description":"Redeem the campaign's trial credit onto the signed-in user's\npersonal account. One trial per user, ever.","operationId":"redeem_api_v1_campaigns__code__redeem_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/metrics/query":{"get":{"tags":["observability"],"summary":"Query Metrics","description":"Execute an instant PromQL query against Mimir.","operationId":"query_metrics_api_v1_clusters__cluster_id__observability_metrics_query_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"PromQL query","title":"Query"},"description":"PromQL query"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Evaluation timestamp (ISO 8601)","title":"Time"},"description":"Evaluation timestamp (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricsQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/metrics/query_range":{"get":{"tags":["observability"],"summary":"Query Metrics Range","description":"Execute a range PromQL query against Mimir.","operationId":"query_metrics_range_api_v1_clusters__cluster_id__observability_metrics_query_range_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"PromQL query","title":"Query"},"description":"PromQL query"},{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"Start timestamp (ISO 8601)","title":"Start"},"description":"Start timestamp (ISO 8601)"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"End timestamp (ISO 8601)","title":"End"},"description":"End timestamp (ISO 8601)"},{"name":"step","in":"query","required":false,"schema":{"type":"string","description":"Query resolution step","default":"60s","title":"Step"},"description":"Query resolution step"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricsQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/metrics/labels":{"get":{"tags":["observability"],"summary":"Get Metric Labels","description":"Get all metric label names.","operationId":"get_metric_labels_api_v1_clusters__cluster_id__observability_metrics_labels_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricLabelsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/metrics/labels/{label}/values":{"get":{"tags":["observability"],"summary":"Get Metric Label Values","description":"Get values for a specific metric label.","operationId":"get_metric_label_values_api_v1_clusters__cluster_id__observability_metrics_labels__label__values_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetricLabelValuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/logs/query":{"get":{"tags":["observability"],"summary":"Query Logs","description":"Execute an instant LogQL query against Loki.","operationId":"query_logs_api_v1_clusters__cluster_id__observability_logs_query_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"LogQL query","title":"Query"},"description":"LogQL query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"description":"Maximum number of entries","default":100,"title":"Limit"},"description":"Maximum number of entries"},{"name":"time","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Evaluation timestamp (ISO 8601)","title":"Time"},"description":"Evaluation timestamp (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogsQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/logs/query_range":{"get":{"tags":["observability"],"summary":"Query Logs Range","description":"Execute a range LogQL query against Loki.","operationId":"query_logs_range_api_v1_clusters__cluster_id__observability_logs_query_range_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"LogQL query","title":"Query"},"description":"LogQL query"},{"name":"start","in":"query","required":true,"schema":{"type":"string","description":"Start timestamp (ISO 8601)","title":"Start"},"description":"Start timestamp (ISO 8601)"},{"name":"end","in":"query","required":true,"schema":{"type":"string","description":"End timestamp (ISO 8601)","title":"End"},"description":"End timestamp (ISO 8601)"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"description":"Maximum number of entries","default":1000,"title":"Limit"},"description":"Maximum number of entries"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogsQueryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/logs/labels":{"get":{"tags":["observability"],"summary":"Get Log Labels","description":"Get all log label names.","operationId":"get_log_labels_api_v1_clusters__cluster_id__observability_logs_labels_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogLabelsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/logs/labels/{label}/values":{"get":{"tags":["observability"],"summary":"Get Log Label Values","description":"Get values for a specific log label.","operationId":"get_log_label_values_api_v1_clusters__cluster_id__observability_logs_labels__label__values_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"label","in":"path","required":true,"schema":{"type":"string","title":"Label"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogLabelValuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/alerts":{"get":{"tags":["observability"],"summary":"Get Alerts","description":"Get alerts for a cluster.","operationId":"get_alerts_api_v1_clusters__cluster_id__observability_alerts_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"active","in":"query","required":false,"schema":{"type":"boolean","description":"Include active alerts","default":true,"title":"Active"},"description":"Include active alerts"},{"name":"silenced","in":"query","required":false,"schema":{"type":"boolean","description":"Include silenced alerts","default":true,"title":"Silenced"},"description":"Include silenced alerts"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/alerts/rules":{"get":{"tags":["observability"],"summary":"Get Alert Rules","description":"Get alert rules for a cluster.","operationId":"get_alert_rules_api_v1_clusters__cluster_id__observability_alerts_rules_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["observability"],"summary":"Create Alert Rule","description":"Create a new alert rule for a cluster.","operationId":"create_alert_rule_api_v1_clusters__cluster_id__observability_alerts_rules_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/alerts/rules/{rule_id}":{"put":{"tags":["observability"],"summary":"Update Alert Rule","description":"Update an alert rule.","operationId":"update_alert_rule_api_v1_clusters__cluster_id__observability_alerts_rules__rule_id__put","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["observability"],"summary":"Delete Alert Rule","description":"Delete an alert rule.","operationId":"delete_alert_rule_api_v1_clusters__cluster_id__observability_alerts_rules__rule_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/alerts/{alert_fingerprint}/silence":{"post":{"tags":["observability"],"summary":"Silence Alert","description":"Silence an alert for a specified duration.","operationId":"silence_alert_api_v1_clusters__cluster_id__observability_alerts__alert_fingerprint__silence_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"alert_fingerprint","in":"path","required":true,"schema":{"type":"string","title":"Alert Fingerprint"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SilenceCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SilenceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/alerts/silences":{"get":{"tags":["observability"],"summary":"Get Silences","description":"Get all silences for a cluster.","operationId":"get_silences_api_v1_clusters__cluster_id__observability_alerts_silences_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SilenceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/alerts/silences/{silence_id}":{"delete":{"tags":["observability"],"summary":"Delete Silence","description":"Delete (expire) a silence.","operationId":"delete_silence_api_v1_clusters__cluster_id__observability_alerts_silences__silence_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"silence_id","in":"path","required":true,"schema":{"type":"string","title":"Silence Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/clusters/{cluster_id}/observability/config":{"get":{"tags":["observability"],"summary":"Get Observability Config","description":"Get observability configuration for a cluster.","operationId":"get_observability_config_api_v1_clusters__cluster_id__observability_config_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["observability"],"summary":"Update Observability Config","description":"Update observability configuration for a cluster.","operationId":"update_observability_config_api_v1_clusters__cluster_id__observability_config_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ObservabilityConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notification-channels":{"get":{"tags":["notifications"],"summary":"List Notification Channels","description":"List all notification channels for the current user.","operationId":"list_notification_channels_api_v1_notification_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelListResponse"}}}}}},"post":{"tags":["notifications"],"summary":"Create Notification Channel","description":"Create a new notification channel.","operationId":"create_notification_channel_api_v1_notification_channels_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notification-channels/{channel_id}":{"get":{"tags":["notifications"],"summary":"Get Notification Channel","description":"Get a specific notification channel.","operationId":"get_notification_channel_api_v1_notification_channels__channel_id__get","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["notifications"],"summary":"Update Notification Channel","description":"Update a notification channel.","operationId":"update_notification_channel_api_v1_notification_channels__channel_id__put","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationChannelResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["notifications"],"summary":"Delete Notification Channel","description":"Delete a notification channel.","operationId":"delete_notification_channel_api_v1_notification_channels__channel_id__delete","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notification-channels/{channel_id}/test":{"post":{"tags":["notifications"],"summary":"Test Notification Channel","description":"Send a test notification to the channel.","operationId":"test_notification_channel_api_v1_notification_channels__channel_id__test_post","parameters":[{"name":"channel_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Channel Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dns-credentials":{"get":{"tags":["dns-credentials"],"summary":"List Dns Credentials","description":"List the DNS credentials the caller can use: their own and those\nof every organization they belong to.","operationId":"list_dns_credentials_api_v1_dns_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSCredentialListResponse"}}}}}},"post":{"tags":["dns-credentials"],"summary":"Create Dns Credential","description":"Create a new DNS credential.\n\nCredentials are stored securely in OpenBao, not in our database.\nAfter creation, credentials should be validated using the validate endpoint.","operationId":"create_dns_credential_api_v1_dns_credentials_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSCredentialCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dns-credentials/domains":{"get":{"tags":["dns-credentials"],"summary":"List Managed Domains","description":"Aggregate the DNS zones discovered across the credentials the caller can use.\n\nPowers the deployment custom-domain picker. Best-effort per credential — a\nprovider that errors just contributes no domains.","operationId":"list_managed_domains_api_v1_dns_credentials_domains_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/dns-credentials/{credential_id}":{"get":{"tags":["dns-credentials"],"summary":"Get Dns Credential","description":"Get a specific DNS credential by ID.","operationId":"get_dns_credential_api_v1_dns_credentials__credential_id__get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSCredentialResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dns-credentials"],"summary":"Delete Dns Credential","description":"Delete a DNS credential.\n\nThis will fail if any deployments are using this credential.","operationId":"delete_dns_credential_api_v1_dns_credentials__credential_id__delete","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dns-credentials/{credential_id}/validate":{"post":{"tags":["dns-credentials"],"summary":"Validate Dns Credential","description":"Validate a DNS credential by testing it against the Bunny.net API.\n\nThis fetches the list of DNS zones to verify the credentials work.","operationId":"validate_dns_credential_api_v1_dns_credentials__credential_id__validate_post","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSCredentialValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dns-credentials/{credential_id}/zones":{"get":{"tags":["dns-credentials"],"summary":"Get Dns Zones","description":"Fetch DNS zones from Bunny.net using the stored credentials.\n\nThis is a proxy endpoint that fetches zones live from Bunny.net.","operationId":"get_dns_zones_api_v1_dns_credentials__credential_id__zones_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BunnyZoneListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/dns-credentials/{credential_id}/zones/{zone_id}/records":{"get":{"tags":["dns-credentials"],"summary":"Get Dns Zone Records","description":"Fetch DNS records for a specific zone from Bunny.net.\n\nThis is a proxy endpoint that fetches records live from Bunny.net.","operationId":"get_dns_zone_records_api_v1_dns_credentials__credential_id__zones__zone_id__records_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}},{"name":"zone_id","in":"path","required":true,"schema":{"type":"integer","title":"Zone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BunnyRecordListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/assistant/chat":{"post":{"tags":["assistant"],"summary":"Assistant Chat","operationId":"assistant_chat_api_v1_assistant_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantChatRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mcp-calls":{"post":{"tags":["mcp-calls"],"summary":"Record Mcp Call","description":"Store one MCP tool call for the user whose token the MCP server forwarded.","operationId":"record_mcp_call_api_v1_mcp_calls_post","parameters":[{"name":"x-mcp-service-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Mcp-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCallRecord"}}}},"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases":{"post":{"tags":["databases"],"summary":"Create Database","description":"Create a new managed database instance.","operationId":"create_database_api_v1_databases_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"List Databases","description":"List managed database instances accessible to the user (owned or via org).","operationId":"list_databases_api_v1_databases_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"cluster_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/{database_id}":{"get":{"tags":["databases"],"summary":"Get Database","description":"Get details of a specific managed database instance.","operationId":"get_database_api_v1_databases__database_id__get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["databases"],"summary":"Update Database","description":"Update configuration of a managed database instance.","operationId":"update_database_api_v1_databases__database_id__patch","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["databases"],"summary":"Delete Database","description":"Delete a managed database instance. If it belongs to a replication group, all members are deleted.","operationId":"delete_database_api_v1_databases__database_id__delete","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/{database_id}/backups":{"post":{"tags":["databases"],"summary":"Create Backup","description":"Trigger a manual backup of a database instance.","operationId":"create_backup_api_v1_databases__database_id__backups_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupCreateRequest","default":{"backup_type":"manual"}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseBackupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"Get Backups","description":"List backups for a database instance.\n\nThe operator takes scheduled backups on the cluster by itself; the\nworker mirrors them into this list. Opening the list asks for a fresh\nmirror so a new scheduled backup shows up on the next refresh instead of\nat the next periodic sweep.","operationId":"get_backups_api_v1_databases__database_id__backups_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseBackupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/{database_id}/restore":{"post":{"tags":["databases"],"summary":"Restore Database","description":"Overwrite the database's current data with one of its backups, in place.\n\n`backup_id` is a backup from GET /databases/{id}/backups that has\ncompleted. The database keeps its name, host, user and password, so\nconnected applications only need to reconnect. Works for PostgreSQL and\nMySQL databases that are not part of a replication group.\n\nThe restore runs in the background and the database shows the status\n`restoring` meanwhile; it is unavailable for most of that time. It\nfirst takes a safety backup of the current data (type `pre_restore`);\nif that backup fails, nothing is overwritten and the database returns to\n`running` with the reason in `error_message`. On success the database\nreturns to `running`; if the restore fails after the data was touched,\nit goes to `error`.\n\nResponds 202 with the database (status `restoring`), 400 when the backup\ncannot be restored in place, 404 when the database or backup is not\nfound, and 409 when the database is not running or already restoring.","operationId":"restore_database_api_v1_databases__database_id__restore_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/{database_id}/credentials":{"get":{"tags":["databases"],"summary":"Get Credentials","description":"Get connection credentials for a database instance.","operationId":"get_credentials_api_v1_databases__database_id__credentials_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseCredentialsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/replication-groups":{"post":{"tags":["databases"],"summary":"Create Replication","description":"Create a replication group spanning multiple clusters.\n\nThe first cluster becomes the primary (read-write). Remaining clusters\nbecome replicas that are provisioned after the primary is running.","operationId":"create_replication_api_v1_databases_replication_groups_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"List Replication","description":"List replication groups accessible to the user (owned or via org).","operationId":"list_replication_api_v1_databases_replication_groups_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationGroupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/replication-groups/{group_id}":{"delete":{"tags":["databases"],"summary":"Delete Replication","description":"Delete a replication group and all its database instances.","operationId":"delete_replication_api_v1_databases_replication_groups__group_id__delete","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/databases/{database_id}/promote":{"post":{"tags":["databases"],"summary":"Promote Database","description":"Promote a replica to primary within its replication group.","operationId":"promote_database_api_v1_databases__database_id__promote_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/register/options":{"post":{"tags":["passkeys"],"summary":"Registration Options","description":"Generate registration options for a new account.","operationId":"registration_options_api_v1_auth_passkeys_register_options_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyRegistrationOptionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/register/verify":{"post":{"tags":["passkeys"],"summary":"Registration Verify","description":"Verify registration and create user + passkey.","operationId":"registration_verify_api_v1_auth_passkeys_register_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyRegistrationVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/login/options":{"post":{"tags":["passkeys"],"summary":"Login Options","description":"Generate authentication options for passkey login.","operationId":"login_options_api_v1_auth_passkeys_login_options_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyLoginOptionsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/login/verify":{"post":{"tags":["passkeys"],"summary":"Login Verify","description":"Verify passkey authentication and log in.","operationId":"login_verify_api_v1_auth_passkeys_login_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyLoginVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/migrate/options":{"post":{"tags":["passkeys"],"summary":"Migrate Options","description":"Generate registration options for passkey migration.","operationId":"migrate_options_api_v1_auth_passkeys_migrate_options_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/passkeys/migrate/verify":{"post":{"tags":["passkeys"],"summary":"Migrate Verify","description":"Verify passkey registration and nullify password_hash.","operationId":"migrate_verify_api_v1_auth_passkeys_migrate_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyMigrateVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/add/options":{"post":{"tags":["passkeys"],"summary":"Add Options","description":"Generate registration options for adding another passkey.","operationId":"add_options_api_v1_auth_passkeys_add_options_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/passkeys/add/verify":{"post":{"tags":["passkeys"],"summary":"Add Verify","description":"Verify and add a new passkey to the current user.","operationId":"add_verify_api_v1_auth_passkeys_add_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyAddVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/passkeys/":{"get":{"tags":["passkeys"],"summary":"List Passkeys","description":"List all passkeys for the current user.","operationId":"list_passkeys_api_v1_auth_passkeys__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/auth/passkeys/{passkey_id}":{"put":{"tags":["passkeys"],"summary":"Rename Passkey","description":"Rename a passkey.","operationId":"rename_passkey_api_v1_auth_passkeys__passkey_id__put","parameters":[{"name":"passkey_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Passkey Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasskeyRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["passkeys"],"summary":"Delete Passkey","description":"Delete a passkey. Blocks if it's the last passkey and user has no OAuth.","operationId":"delete_passkey_api_v1_auth_passkeys__passkey_id__delete","parameters":[{"name":"passkey_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Passkey Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{category}":{"get":{"tags":["articles"],"summary":"List Articles","description":"List published articles in a category, newest first.","operationId":"list_articles_api_v1_articles__category__get","parameters":[{"name":"category","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ArticleCategory"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{category}/{slug}":{"get":{"tags":["articles"],"summary":"Get Article","description":"Get a single published article by category + slug.","operationId":"get_article_api_v1_articles__category___slug__get","parameters":[{"name":"category","in":"path","required":true,"schema":{"$ref":"#/components/schemas/ArticleCategory"}},{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_slug}/invoice-settings":{"get":{"tags":["invoice-settings"],"summary":"Get Invoice Settings","description":"Get invoice settings for an organization.","operationId":"get_invoice_settings_api_v1_organizations__org_slug__invoice_settings_get","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["invoice-settings"],"summary":"Create Invoice Settings","description":"Create invoice settings for an organization.","operationId":"create_invoice_settings_api_v1_organizations__org_slug__invoice_settings_post","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["invoice-settings"],"summary":"Update Invoice Settings","description":"Update invoice settings for an organization.","operationId":"update_invoice_settings_api_v1_organizations__org_slug__invoice_settings_patch","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["invoice-settings"],"summary":"Delete Invoice Settings","description":"Delete invoice settings for an organization.","operationId":"delete_invoice_settings_api_v1_organizations__org_slug__invoice_settings_delete","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_slug}/invoice-settings/validate-vat":{"post":{"tags":["invoice-settings"],"summary":"Validate Vat Number","description":"Validate a VAT number without saving it.","operationId":"validate_vat_number_api_v1_organizations__org_slug__invoice_settings_validate_vat_post","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATValidationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/organizations/{org_slug}/invoice-settings/reverify-vat":{"post":{"tags":["invoice-settings"],"summary":"Reverify Vat Number","description":"Re-verify the stored VAT number with VIES.","operationId":"reverify_vat_number_api_v1_organizations__org_slug__invoice_settings_reverify_vat_post","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/countries":{"get":{"tags":["countries"],"summary":"List Countries","description":"Get list of countries for dropdown.","operationId":"list_countries_api_v1_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryListResponse"}}}}}}},"/api/v1/migrations":{"get":{"tags":["migrations"],"summary":"List Migrations","description":"List migrations visible to the current user.","operationId":"list_migrations_api_v1_migrations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationListResponse"}}}}}},"post":{"tags":["migrations"],"summary":"Create Migration","description":"Start a namespace migration from one cluster to another.","operationId":"create_migration_api_v1_migrations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/migrations/{migration_id}":{"get":{"tags":["migrations"],"summary":"Get Migration","operationId":"get_migration_api_v1_migrations__migration_id__get","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["migrations"],"summary":"Cancel Migration","description":"Cancel a running migration, or delete a finished one.\n\nWhile a migration is in progress the worker observes the cancelled\nstatus between orchestration steps and aborts, cleaning up Velero from\nboth clusters. Once it has completed, failed or been cancelled, the\nrecord (with its run history) is removed; the migrated resources on the\ntarget cluster are left in place.","operationId":"cancel_migration_api_v1_migrations__migration_id__delete","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/migrations/{migration_id}/resync":{"post":{"tags":["migrations"],"summary":"Resync Migration","description":"Re-run a completed or failed migration to refresh the target from the source.\n\nThe worker clears the previously restored copy on the target namespace\nand restores a fresh backup of the current source state. Data on the\ntarget copy is replaced. For a failed migration this is the retry path.","operationId":"resync_migration_api_v1_migrations__migration_id__resync_post","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/migrations/{migration_id}/resync-schedule":{"put":{"tags":["migrations"],"summary":"Set Resync Schedule","description":"Set or clear the automatic re-sync schedule for a migration.\n\nThe worker re-runs the migration whenever the interval has elapsed\nsince its last run, as long as it is in completed state.","operationId":"set_resync_schedule_api_v1_migrations__migration_id__resync_schedule_put","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationResyncSchedule"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/migrations/{migration_id}/runs":{"get":{"tags":["migrations"],"summary":"List Migration Runs","description":"Every run of a migration (initial + re-syncs), newest first.","operationId":"list_migration_runs_api_v1_migrations__migration_id__runs_get","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationRunListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/backups":{"get":{"tags":["backups"],"summary":"List Backups","description":"List backups of this deployment, newest first (read live from the cluster).","operationId":"list_backups_api_v1_deployments__deployment_id__backups_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentBackupList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["backups"],"summary":"Create Backup","description":"Start an on-demand backup of this deployment.","operationId":"create_backup_api_v1_deployments__deployment_id__backups_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/backups/{backup_name}/restore":{"post":{"tags":["backups"],"summary":"Restore Backup","description":"Overwrite this deployment with a completed backup.\n\nA safety backup of the current state is taken first. Then the\ndeployment's volumes and its Kubernetes objects that git does not own are\nreplaced with the backup's; its configuration (image, environment,\nreplicas) stays as it is now. The deployment is down while the restore\nruns; a failed restore rolls back to the safety backup. Dedicated clusters\nonly. Requires org ADMIN on the deployment. Progress:\nGET /deployments/{id}/restores.","operationId":"restore_backup_api_v1_deployments__deployment_id__backups__backup_name__restore_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"backup_name","in":"path","required":true,"schema":{"type":"string","title":"Backup Name"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentRestoreQueued"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/deployments/{deployment_id}/restores":{"get":{"tags":["backups"],"summary":"List Restores","description":"Restores of this deployment from backups, newest first, with progress and outcome.","operationId":"list_restores_api_v1_deployments__deployment_id__restores_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentRestoreList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/stats":{"get":{"tags":["admin"],"summary":"Get Admin Stats","description":"Get system-wide statistics.","operationId":"get_admin_stats_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStatsResponse"}}}}}}},"/admin/revenue":{"get":{"tags":["admin"],"summary":"Get Revenue Report","description":"Get revenue report per customer for current month and year.\nShows revenue breakdown by customer with month, year, and all-time totals.","operationId":"get_revenue_report_admin_revenue_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevenueReportResponse"}}}}}}},"/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"List all users with pagination and search.","operationId":"list_users_admin_users_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}":{"get":{"tags":["admin"],"summary":"Get User","description":"Get detailed user information.","operationId":"get_user_admin_users__user_id__get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin"],"summary":"Update User","description":"Update user (e.g., suspend/reactivate, record unsubscribes).","operationId":"update_user_admin_users__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"is_active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},{"name":"marketing_opt_out","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Marketing Opt Out"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete User","description":"Delete a user account immediately (no grace period).\n\nSame cleanup as the scheduled account deletion: credentials with their\nsecrets, the personal organization and its OpenBao namespaces, then the\nuser row. Refuses (409) while the account still owns clusters,\ndeployments, databases or secrets, or money is outstanding — those go\nthrough their own delete flows first. Platform admins must be removed\nfrom the Mengi organization before they can be deleted.","operationId":"delete_user_admin_users__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/feature-flags":{"patch":{"tags":["admin"],"summary":"Update User Feature Flags","description":"Enable or disable feature flags for a user.","operationId":"update_user_feature_flags_admin_users__user_id__feature_flags_patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/users/{user_id}/impersonate":{"post":{"tags":["admin"],"summary":"Impersonate User","description":"Start impersonating another user.\n\nMints a new JWT for the target user (with `imp` claim = admin's id) and\nsets it as the `access_token` cookie, while preserving the admin's original\ntoken in `admin_access_token` so `/auth/stop-impersonating` can restore it.","operationId":"impersonate_user_admin_users__user_id__impersonate_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/marketing-emails":{"get":{"tags":["admin"],"summary":"List Marketing Email Types","description":"Available marketing (drip) email templates as key/label pairs.\n\nThe admin UI builds its dropdown from this, so the backend dict stays the\nsingle source of truth and renamed/removed templates can't drift in the UI.","operationId":"list_marketing_email_types_admin_marketing_emails_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/users/{user_id}/marketing-email":{"post":{"tags":["admin"],"summary":"Send User Marketing Email","description":"Send one marketing (drip) email to a user, manually triggered by an admin.\n\nDelivery failures surface as 502 so the admin UI shows a real error\ninstead of silently doing nothing; the ops inbox copy is the send log.","operationId":"send_user_marketing_email_admin_users__user_id__marketing_email_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarketingEmailRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters":{"get":{"tags":["admin"],"summary":"List Clusters","description":"List all clusters with filters.","operationId":"list_clusters_admin_clusters_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},{"name":"is_shared","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Shared"}},{"name":"is_management","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Management"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters/{cluster_id}":{"get":{"tags":["admin"],"summary":"Get Cluster","description":"Get detailed cluster information.","operationId":"get_cluster_admin_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Cluster","description":"Delete a cluster (admin only).\nUnlike the user endpoint, this bypasses ownership checks.\nUse force=true to delete clusters with active deployments.","operationId":"delete_cluster_admin_clusters__cluster_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Force delete even with active deployments","default":false,"title":"Force"},"description":"Force delete even with active deployments"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/databases/re-render-manifests":{"post":{"tags":["admin"],"summary":"Re Render Database Manifests","description":"Regenerate and re-apply the manifests of every running managed database.\n\nRolls generator changes (e.g. a new ScheduledBackup) out to databases that\nalready exist: the worker's database.create job commits the rendered\nmanifest to the values repo and is a no-op when nothing changed.","operationId":"re_render_database_manifests_admin_databases_re_render_manifests_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/clusters/{cluster_id}/drift-check":{"post":{"tags":["admin"],"summary":"Trigger Cluster Drift Check","description":"Trigger drift detection for a cluster (works for any cluster status).","operationId":"trigger_cluster_drift_check_admin_clusters__cluster_id__drift_check_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters/{cluster_id}/replace-control-plane":{"post":{"tags":["admin"],"summary":"Replace Cluster Control Plane","description":"Replace a Hetzner cluster's control-plane servers with another type, one at a time.\n\nOnly for production-tier clusters, which run 3 control-plane servers:\nreplacing one leaves the other two (etcd quorum). Management clusters are\nrefused because their control-plane nodes need 8 GB or more. The cluster\ngoes to UPGRADING before the job is queued, so drift, rollovers and\nautoscaling changes leave the stack alone until the worker finishes.\n\nA replacement the worker stopped stays UPGRADING (its status message\nstarts with \"Control-plane replacement stopped\"). Calling this again\nre-queues it without unlocking the stack; the worker resumes where it\nstopped. If the job died without recording that (a worker crash), `force`\nre-queues any replacement still marked UPGRADING, unless BullMQ still holds\na replacement job for the cluster (queued, running or awaiting a retry).","operationId":"replace_cluster_control_plane_admin_clusters__cluster_id__replace_control_plane_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ControlPlaneReplacementRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters/{cluster_id}/autoscaler-server-type":{"post":{"tags":["admin"],"summary":"Pin Cluster Autoscaler Server Type","description":"Pin the node type a Hetzner cluster's autoscaler adds, or clear the pin.\n\nWithout a pin the autoscaler adds server_type, or an in-stock fallback\nwhile server_type is out of stock. A pinned type is used as-is, with no\nstock fallback: the autoscaler keeps retrying it while it is out of\nstock. Used to bring up capacity of a new type before a server-type\nrollover. The autoscaler config is re-applied straight away.\n\nA pin is an admin override: it also skips the worker's tier-size floor,\nso it may pin a type below the tier's node size (as the nbg1 host runs\ncx23 workers by decision). Hetzner must offer the type in the location.","operationId":"pin_cluster_autoscaler_server_type_admin_clusters__cluster_id__autoscaler_server_type_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoscalerServerTypePin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters/{cluster_id}/kubeconfig":{"get":{"tags":["admin"],"summary":"Download Kubeconfig","description":"Download admin kubeconfig for a cluster (full admin access).","operationId":"download_kubeconfig_admin_clusters__cluster_id__kubeconfig_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters/{cluster_id}/retry":{"post":{"tags":["admin"],"summary":"Retry Cluster Provisioning","description":"Retry provisioning a cluster that failed.","operationId":"retry_cluster_provisioning_admin_clusters__cluster_id__retry_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deployments":{"get":{"tags":["admin"],"summary":"List Deployments","description":"List all deployments with filters.","operationId":"list_deployments_admin_deployments_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"git_sync_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Sync Status"}},{"name":"has_error","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deployments/{deployment_id}/retry-git-sync":{"post":{"tags":["admin"],"summary":"Retry Deployment Git Sync","description":"Retry git sync for a deployment that failed.","operationId":"retry_deployment_git_sync_admin_deployments__deployment_id__retry_git_sync_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/deployments/{deployment_id}":{"delete":{"tags":["admin"],"summary":"Delete Deployment","description":"Delete a deployment (admin only).","operationId":"delete_deployment_admin_deployments__deployment_id__delete","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/organizations":{"get":{"tags":["admin"],"summary":"List Organizations","description":"List all organizations.","operationId":"list_organizations_admin_organizations_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/organizations/{org_id}/members":{"get":{"tags":["admin"],"summary":"Admin List Organization Members","description":"List the members of an organization.","operationId":"admin_list_organization_members_admin_organizations__org_id__members_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AdminOrganizationMemberResponse"},"title":"Response Admin List Organization Members Admin Organizations  Org Id  Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Admin Add Organization Members","description":"Add existing users to an organization directly, without an invitation.\n\nUsers can be given by id or by email (case-insensitive). Users already in\nthe organization keep their current role and are reported under\n``already_members``; emails that match no account land in ``not_found``.","operationId":"admin_add_organization_members_admin_organizations__org_id__members_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOrganizationMembersAdd"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminOrganizationMembersAddResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/organizations/{org_id}/members/{user_id}":{"delete":{"tags":["admin"],"summary":"Admin Remove Organization Member","description":"Remove a member from an organization. The last owner cannot be removed.","operationId":"admin_remove_organization_member_admin_organizations__org_id__members__user_id__delete","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Org Id"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/infrastructure":{"get":{"tags":["admin"],"summary":"List Zone Infrastructure","description":"List all zone infrastructure.","operationId":"list_zone_infrastructure_admin_infrastructure_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/infrastructure/{zone_id}":{"get":{"tags":["admin"],"summary":"Get Zone Infrastructure","description":"Get detailed zone infrastructure with NAT gateways.","operationId":"get_zone_infrastructure_admin_infrastructure__zone_id__get","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Zone Infrastructure","description":"Delete a zone infrastructure record.\nThis only deletes the database record, not the actual cloud resources.\nUse this to clean up stale records when cloud resources were deleted outside of Mengi.","operationId":"delete_zone_infrastructure_admin_infrastructure__zone_id__delete","parameters":[{"name":"zone_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/management-cluster":{"get":{"tags":["admin"],"summary":"Get Management Cluster","description":"Get the management cluster status.","operationId":"get_management_cluster_admin_management_cluster_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["admin"],"summary":"Provision Management Cluster","description":"Provision the management cluster with ArgoCD.\n\nUses the same cluster creation code path as normal dedicated clusters,\nwith is_management=True to enable management-specific post-provisioning\n(ArgoCD installation, DNS updates, etc.).","operationId":"provision_management_cluster_admin_management_cluster_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProvisionManagementClusterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/management-cluster/retry":{"post":{"tags":["admin"],"summary":"Retry Management Cluster","description":"Retry provisioning the management cluster.","operationId":"retry_management_cluster_admin_management_cluster_retry_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/management-cluster/register/{cluster_id}":{"post":{"tags":["admin"],"summary":"Register Cluster With Management","description":"Register a client cluster with the management cluster for ArgoCD.","operationId":"register_cluster_with_management_admin_management_cluster_register__cluster_id__post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/management-cluster/re-register/{cluster_id}":{"post":{"tags":["admin"],"summary":"Re Register Cluster With Management","description":"Re-register a client cluster with the management cluster.\nThis updates the ArgoCD cluster secret with current labels (e.g., traefik-mode).","operationId":"re_register_cluster_with_management_admin_management_cluster_re_register__cluster_id__post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/hetzner-projects":{"get":{"tags":["admin"],"summary":"List Hetzner Projects","description":"List all Hetzner projects in the pool.\nProjects are configured via HETZNER_PROJECTS environment variable.","operationId":"list_hetzner_projects_admin_hetzner_projects_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/provider-regions":{"get":{"tags":["admin"],"summary":"Get Provider Regions","description":"Get all provider regions with their enabled/disabled status.\nOptionally filter by provider.","operationId":"get_provider_regions_admin_provider_regions_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/provider-regions/{provider}/{region}":{"patch":{"tags":["admin"],"summary":"Update Provider Region","description":"Enable or disable a provider region.\nWhen disabled, users cannot create new clusters in that region.","operationId":"update_provider_region_admin_provider_regions__provider___region__patch","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"path","required":true,"schema":{"type":"string","title":"Region"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProviderRegionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"Get Provider Region","description":"Get the status of a specific provider region.","operationId":"get_provider_region_admin_provider_regions__provider___region__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"path","required":true,"schema":{"type":"string","title":"Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/dns/argocd":{"post":{"tags":["admin"],"summary":"Update Argocd Dns","description":"Update the ArgoCD DNS record (argocd.mengi.cloud).","operationId":"update_argocd_dns_admin_dns_argocd_post","parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string","title":"Ip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/dns/clusters-wildcard":{"post":{"tags":["admin"],"summary":"Update Clusters Wildcard Dns","description":"Update the wildcard clusters DNS record (*.clusters.mengi.cloud).","operationId":"update_clusters_wildcard_dns_admin_dns_clusters_wildcard_post","parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string","title":"Ip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/dns/record":{"post":{"tags":["admin"],"summary":"Add Dns Record","description":"Add a custom DNS A record to mengi.cloud.","operationId":"add_dns_record_admin_dns_record_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DNSRecordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/clusters/{cluster_id}/trigger-upgrade":{"post":{"tags":["admin"],"summary":"Trigger Cluster Upgrade","description":"Trigger a pending scheduled upgrade for a specific cluster immediately.\n\nThis is an admin-only function to force-execute an auto-scheduled upgrade\nfor a specific cluster, regardless of its scheduled date.","operationId":"trigger_cluster_upgrade_admin_clusters__cluster_id__trigger_upgrade_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/harbor/create-bucket":{"post":{"tags":["admin"],"summary":"Create Harbor Storage Bucket","description":"Create the Harbor storage bucket on Hetzner Object Storage.\nThis is required before deploying Harbor.","operationId":"create_harbor_storage_bucket_admin_harbor_create_bucket_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/harbor/create-dns":{"post":{"tags":["admin"],"summary":"Create Harbor Dns Record","description":"Create DNS record for registry.mengi.cloud.\nPoints to the management cluster's ingress IP.","operationId":"create_harbor_dns_record_admin_harbor_create_dns_post","parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string","title":"Ip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/harbor/setup":{"post":{"tags":["admin"],"summary":"Setup Harbor Infrastructure","description":"Set up all Harbor infrastructure components:\n- Hetzner Object Storage bucket for image storage\n- DNS record for registry.mengi.cloud\n\nIf management_cluster_ip is not provided, it will be fetched from the\nmanagement cluster's Traefik LoadBalancer IP.","operationId":"setup_harbor_infrastructure_admin_harbor_setup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HarborSetupRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/harbor/configure":{"post":{"tags":["admin"],"summary":"Configure Harbor Projects","description":"Configure Harbor projects + robot accounts via the configureHarbor Pulumi\nprogram (run by the worker). Creates the `mengi` and public `mengi-public`\nprojects and their CI/pull robot accounts, writing robot credentials to\nOpenBao (harbor/docker-config, harbor/ci, harbor/public-ci). Idempotent once\nthe harbor-config Pulumi stack exists.","operationId":"configure_harbor_projects_admin_harbor_configure_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/openbao/setup":{"post":{"tags":["admin"],"summary":"Setup Openbao","description":"Set up OpenBao secrets management.\n\nThis will:\n1. Initialize OpenBao (if not already initialized)\n2. Unseal OpenBao\n3. Enable KV v2 secrets engine\n4. Configure Kubernetes authentication\n5. Create policies for services\n6. Create Kubernetes auth roles\n\nReturns unseal keys and root token for newly initialized instances.\nIMPORTANT: Save these securely - they cannot be retrieved later!","operationId":"setup_openbao_admin_openbao_setup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/openbao/unseal":{"post":{"tags":["admin"],"summary":"Unseal Openbao","description":"Unseal OpenBao with provided keys.\n\nUse this when OpenBao has been restarted and needs to be unsealed.\nRequires at least 3 of the 5 unseal keys.","operationId":"unseal_openbao_admin_openbao_unseal_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenBaoUnsealRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/openbao/configure":{"post":{"tags":["admin"],"summary":"Configure Openbao","description":"Configure an already-unsealed OpenBao instance.\n\nUse this when OpenBao was previously initialized but configuration was not completed.\nRequires the root token from initialization.","operationId":"configure_openbao_admin_openbao_configure_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenBaoConfigureRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/component-bundles":{"get":{"tags":["admin"],"summary":"List Admin Component Bundles","description":"List all component bundles with admin descriptions.\nUnlike the public endpoint, this shows ALL versions (no minimum version filter).","operationId":"list_admin_component_bundles_admin_component_bundles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/component-bundles/{version}/description":{"put":{"tags":["admin"],"summary":"Update Bundle Description","description":"Set or update the admin description for a component bundle version.","operationId":"update_bundle_description_admin_component_bundles__version__description_put","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BundleDescriptionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin"],"summary":"Delete Bundle Description","description":"Remove the admin description for a component bundle version.","operationId":"delete_bundle_description_admin_component_bundles__version__description_delete","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/organizations/{organization_id}/trial-credit":{"post":{"tags":["admin"],"summary":"Ensure Organization Trial Credit","description":"Ensure an existing organization has trial credit (default €50).\n\nSame trial as an admin invitation — infra costs consume the credit, the\nplatform fee is waived and no payment mandate is needed — but for an\norganization that already exists (e.g. one created for a demo). Idempotent:\nan organization that already received trial credit is left as is and the\nresponse says `granted: false`.","operationId":"ensure_organization_trial_credit_admin_organizations__organization_id__trial_credit_post","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organization Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTrialCreditRequest","default":{"amount_eur":50.0}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTrialCreditResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/invitations":{"post":{"tags":["admin"],"summary":"Create Admin Invitation","description":"Invite a prospect by email into a new organization, an existing one,\nor no organization at all (the invitee's personal account).\n\nTrial credit (infra credit, platform fee waived until spent, no payment\nmandate required) applies to the target's subscription: the org's, or the\ninvitee's personal one. New-org invites default to a €50 trial. The\nresponse carries the invite URL exactly once — copy it if the email can't\nbe delivered.","operationId":"create_admin_invitation_admin_invitations_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminInvitationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminInvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"List Admin Invitations","description":"List invitations, newest first, with pagination.","operationId":"list_admin_invitations_admin_invitations_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/invitations/{invitation_id}":{"delete":{"tags":["admin"],"summary":"Revoke Admin Invitation","description":"Revoke a pending invitation (its link stops working).","operationId":"revoke_admin_invitation_admin_invitations__invitation_id__delete","parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/invitations/{invitation_id}/resend":{"post":{"tags":["admin"],"summary":"Resend Admin Invitation","description":"Re-send a pending invitation with a fresh token (the old link dies).","operationId":"resend_admin_invitation_admin_invitations__invitation_id__resend_post","parameters":[{"name":"invitation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invitation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminInvitationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/campaigns":{"post":{"tags":["admin"],"summary":"Create Admin Campaign","description":"Create a QR/link campaign: anyone who signs up via its join URL\nreceives the trial credit on their personal account (one trial per\nuser, ever).","operationId":"create_admin_campaign_admin_campaigns_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCampaignCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCampaignResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["admin"],"summary":"List Admin Campaigns","description":"List campaigns, newest first, with pagination.","operationId":"list_admin_campaigns_admin_campaigns_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/assistant-prompts":{"get":{"tags":["admin"],"summary":"List Assistant Prompts","description":"Everything users said to Menno and every approve/decline, newest first.","operationId":"list_assistant_prompts_admin_assistant_prompts_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantPromptLogList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mcp-calls":{"get":{"tags":["admin"],"summary":"List Mcp Calls","description":"Every tool call made through the MCP server, newest first.","operationId":"list_mcp_calls_admin_mcp_calls_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}},{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Tool"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["ok","error"],"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpCallLogList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/campaigns/{campaign_id}":{"delete":{"tags":["admin"],"summary":"Revoke Admin Campaign","description":"Revoke a campaign (its QR code and join URL stop working).\nAlready-granted credit is unaffected.","operationId":"revoke_admin_campaign_admin_campaigns__campaign_id__delete","parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Campaign Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/object-storage/required-buckets":{"get":{"tags":["admin","object-storage"],"summary":"Get Required Buckets Status","description":"Get status of all required system storage buckets.\nChecks S3 API to verify which buckets exist.","operationId":"get_required_buckets_status_admin_object_storage_required_buckets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequiredBucketsResponse"}}}}}}},"/admin/object-storage/required-buckets/create-missing":{"post":{"tags":["admin","object-storage"],"summary":"Create Missing Required Buckets","description":"Create all missing required system storage buckets via S3 API.","operationId":"create_missing_required_buckets_admin_object_storage_required_buckets_create_missing_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMissingBucketsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateMissingBucketsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/articles":{"get":{"tags":["admin","admin-articles"],"summary":"List Admin Articles","operationId":"list_admin_articles_admin_articles_get","parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ArticleCategory"},{"type":"null"}],"title":"Category"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminArticleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin","admin-articles"],"summary":"Create Article","operationId":"create_article_admin_articles_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminArticleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/articles/{article_id}":{"get":{"tags":["admin","admin-articles"],"summary":"Get Admin Article","operationId":"get_admin_article_admin_articles__article_id__get","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Article Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminArticleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["admin","admin-articles"],"summary":"Update Article","operationId":"update_article_admin_articles__article_id__patch","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Article Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminArticleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["admin","admin-articles"],"summary":"Delete Article","operationId":"delete_article_admin_articles__article_id__delete","parameters":[{"name":"article_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Article Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/articles/upload-image":{"post":{"tags":["admin","admin-articles"],"summary":"Upload Article Image","description":"Upload an image and return its public URL.\n\nThe frontend uses this for cover images and inline `![](url)` markdown.","operationId":"upload_article_image_admin_articles_upload_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_article_image_admin_articles_upload_image_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadImageResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/backups/clusters":{"get":{"tags":["internal"],"summary":"List Backup Enabled Clusters","description":"Cluster ids with at least one backup-enabled deployment.\n\nConsumed by the worker's daily backup.rotate-credentials job, which\nre-runs the idempotent cluster setup (heals credential secrets and\nrotates org API keys approaching their mandatory expiry).","operationId":"list_backup_enabled_clusters_internal_backups_clusters_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/backups/meter-usage":{"post":{"tags":["internal"],"summary":"Meter Backup Usage","description":"Meter per-organization backup bucket storage into usage records.\n\nInvoked hourly by the worker's backup.meter-usage repeatable job.","operationId":"meter_backup_usage_internal_backups_meter_usage_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/migrations/run-due-resyncs":{"post":{"tags":["internal"],"summary":"Run Due Migration Resyncs","description":"Trigger re-syncs for completed migrations whose schedule is due.\n\nInvoked by the worker's migration.auto-resync repeatable job.","operationId":"run_due_migration_resyncs_internal_migrations_run_due_resyncs_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/meter-usage":{"post":{"tags":["internal"],"summary":"Meter Database Usage","description":"Meter the flat managed-database platform fee into usage records.\n\nInvoked hourly by the worker's database.meter-usage repeatable job.","operationId":"meter_database_usage_internal_databases_meter_usage_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/billable":{"get":{"tags":["internal"],"summary":"Get Billable Clusters","description":"Get all clusters that should be billed (running, not host/management clusters).\n\nSupports pagination with skip/limit parameters.\n\nReturns clusters that are:\n- Running status\n- Not host clusters (host clusters are internal infrastructure)\n- Not management clusters (management is internal infrastructure)","operationId":"get_billable_clusters_internal_clusters_billable_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/running":{"get":{"tags":["internal"],"summary":"Get Running Clusters","description":"Get all running clusters for drift check (internal).\n\nSupports pagination with skip/limit parameters.\nDefault limit is 100 to handle most deployments in one request.","operationId":"get_running_clusters_internal_clusters_running_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/adopt-argocd":{"post":{"tags":["internal"],"summary":"Adopt Argocd","description":"Adopt a pre-Pulumi ArgoCD install into the mengi-argocd Pulumi stack\n(internal, ops-triggered).\n\nFor management clusters provisioned before the mengi-argocd stack existed\n(pulumi_stack_name NULL, so the drift loop never reconciles them), this\nenqueues the one-off worker task that imports the existing argocd\nnamespace + Helm release and reconciles the Helm values from code.\nSafe to re-run; also serves as the values-reconcile entrypoint for\nadopted clusters.","operationId":"adopt_argocd_internal_clusters__cluster_id__adopt_argocd_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/apply-rke2-config":{"post":{"tags":["internal"],"summary":"Apply Rke2 Config","description":"Apply RKE2 component config via the mengi-rke2-config Pulumi stack\n(internal, ops-triggered).\n\nFor management clusters whose nodes predate the cloud-init fixes: cilium\n+ snapshot-controller HelmChartConfigs (resources + the cilium\nk8sServiceHost pin) and hcloud CSI container resources. NOTE: the first\nrun rolls the Cilium agent DaemonSet node by node.","operationId":"apply_rke2_config_internal_clusters__cluster_id__apply_rke2_config_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/management":{"get":{"tags":["internal"],"summary":"Get Management Cluster","description":"Get the management cluster (internal).","operationId":"get_management_cluster_internal_clusters_management_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}":{"get":{"tags":["internal"],"summary":"Get Cluster","description":"Get a cluster by ID (internal).","operationId":"get_cluster_internal_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["internal"],"summary":"Delete Cluster","description":"Delete a cluster and its cloud infrastructure (internal).\n\nTriggers a destroy job to clean up actual cloud resources (Pulumi/Scaleway/etc),\nthen removes the DB record.","operationId":"delete_cluster_internal_clusters__cluster_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/autoscaler-server-type":{"patch":{"tags":["internal"],"summary":"Update Cluster Autoscaler Server Type","description":"Record the server type the autoscaler adds while server_type is out of stock (internal).\n\nNull clears it once server_type is in stock again. Kept apart from\nserver_type, which Pulumi builds the cluster's own servers from: recording\na fallback there made the next stack run replace every worker.","operationId":"update_cluster_autoscaler_server_type_internal_clusters__cluster_id__autoscaler_server_type_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterAutoscalerServerTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/initial-server-type":{"patch":{"tags":["internal"],"summary":"Update Cluster Initial Server Type","description":"Record the machine type of a cluster's original node pool (internal).\n\nSet once by the worker before the first server-type rollover of a\ncluster that was created on the tier default, from the live nodes'\ninstance-type label. Never overwritten afterwards: the embedded default\npool on AKS/DOKS stays pinned to this type for the cluster's lifetime.","operationId":"update_cluster_initial_server_type_internal_clusters__cluster_id__initial_server_type_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterInitialServerTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/provisioning-version":{"patch":{"tags":["internal"],"summary":"Record Cluster Provisioning Version","description":"Record the release a cluster without a version is provisioned with (internal).\n\nA cluster created while no default version could be resolved has none,\nand the worker picks the latest release for it. That choice must hold\nacross provisioning retries, or a retry after a newer release came out\nwould build its remaining servers on a different one. So the version is\nonly set while the record is empty, in one conditional UPDATE; the reply\nis the version now on record, which the worker then builds with.","operationId":"record_cluster_provisioning_version_internal_clusters__cluster_id__provisioning_version_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterProvisioningVersionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/provisioned-server-type":{"patch":{"tags":["internal"],"summary":"Record Cluster Provisioned Server Type","description":"Record the worker type a cluster's servers were provisioned with (internal).\n\nProvisioning picks the type when the cluster was created without one, and\nmay fall back to another when Hetzner has the first out of stock. Without\nthe record, later paths read no type: the autoscaler then sized its\nout-of-stock fallback from its cx23 default, below the tier's node size\n(rke2-boot-smoke, 2026-10-08). Only while the cluster is provisioning;\nafterwards a type changes through a server-type change (rollover).","operationId":"record_cluster_provisioned_server_type_internal_clusters__cluster_id__provisioned_server_type_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterProvisionedServerTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/control-plane-server-type":{"patch":{"tags":["internal"],"summary":"Update Cluster Control Plane Server Type","description":"Record the control-plane node type chosen at provisioning (internal).\n\nThe worker sets it only while the cluster has no control-plane servers,\nre-choosing from current stock on each attempt, and clears it (null) when\nnothing small enough is in stock and the control plane goes on the worker\ntype. Once servers exist it never changes it: Hetzner cannot shrink a\nserver's disk.","operationId":"update_cluster_control_plane_server_type_internal_clusters__cluster_id__control_plane_server_type_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterControlPlaneServerTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/status":{"patch":{"tags":["internal"],"summary":"Update Cluster Status","description":"Update cluster status (internal).","operationId":"update_cluster_status_internal_clusters__cluster_id__status_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/provisioned":{"patch":{"tags":["internal"],"summary":"Update Cluster Provisioned","description":"Update cluster with provisioned info (internal).\n\nThe kubeconfig from provisioning is the admin kubeconfig (IAM auth for EKS,\ngcloud for GKE, RKE2 admin kubeconfig for Hetzner). It's stored in both fields initially:\n- admin_kubeconfig: Preserved for admin operations (ArgoCD, upgrades, etc.)\n- kubeconfig: Will be replaced with dashboard SA token for read-only access","operationId":"update_cluster_provisioned_internal_clusters__cluster_id__provisioned_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterProvisionedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/admin-kubeconfig":{"get":{"tags":["internal"],"summary":"Get Cluster Admin Kubeconfig","description":"Get cluster admin kubeconfig (internal).\n\nReturns the admin kubeconfig with full cluster access.\nUsed by workers for k3k operations that require cluster-admin permissions.","operationId":"get_cluster_admin_kubeconfig_internal_clusters__cluster_id__admin_kubeconfig_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/kubeconfig":{"patch":{"tags":["internal"],"summary":"Update Cluster Kubeconfig","description":"Update cluster dashboard kubeconfig (internal).\n\nThis updates the read-only kubeconfig used for dashboard metrics and status.\nThe admin_kubeconfig is preserved separately for admin operations.\n\nUsed to replace expiring tokens with long-lived service account tokens.","operationId":"update_cluster_kubeconfig_internal_clusters__cluster_id__kubeconfig_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterKubeconfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/imported":{"patch":{"tags":["internal"],"summary":"Update Cluster Imported","description":"Update an imported cluster with argocd-manager kubeconfig and API endpoint (internal).","operationId":"update_cluster_imported_internal_clusters__cluster_id__imported_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterImportedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/zone-info":{"patch":{"tags":["internal"],"summary":"Update Cluster Zone Info","description":"Update cluster with zone infrastructure info (internal).","operationId":"update_cluster_zone_info_internal_clusters__cluster_id__zone_info_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterZoneInfoUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/version":{"patch":{"tags":["internal"],"summary":"Update Cluster Version","description":"Update cluster Kubernetes version after upgrade (internal).","operationId":"update_cluster_version_internal_clusters__cluster_id__version_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterVersionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/stack-name":{"patch":{"tags":["internal"],"summary":"Update Cluster Stack Name","description":"Set the Pulumi stack name for a cluster (internal).","operationId":"update_cluster_stack_name_internal_clusters__cluster_id__stack_name_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterStackNameUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/region":{"patch":{"tags":["internal"],"summary":"Update Cluster Region","description":"Update cluster region (internal).\n\nUsed by the worker when a host cluster is provisioned in a fallback\nregion due to capacity constraints at the original location.","operationId":"update_cluster_region_internal_clusters__cluster_id__region_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterRegionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/management":{"patch":{"tags":["internal"],"summary":"Update Cluster As Management","description":"Mark cluster as management cluster with ArgoCD info (internal).","operationId":"update_cluster_as_management_internal_clusters__cluster_id__management_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterManagementUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/argocd-url":{"patch":{"tags":["internal"],"summary":"Update Cluster Argocd Url","description":"Update cluster ArgoCD URL (internal).","operationId":"update_cluster_argocd_url_internal_clusters__cluster_id__argocd_url_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterArgocdUrlUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/ingress-address":{"patch":{"tags":["internal"],"summary":"Update Cluster Ingress Address","description":"Update cluster Traefik LoadBalancer address (internal).","operationId":"update_cluster_ingress_address_internal_clusters__cluster_id__ingress_address_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterIngressAddressUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters":{"post":{"tags":["internal"],"summary":"Create Cluster Internal","description":"Create a cluster via internal API.\n\nThis endpoint is for integration testing and service-to-service cluster creation.\nIt bypasses billing verification but requires a valid user_id.","operationId":"create_cluster_internal_internal_clusters_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalClusterCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/timing":{"patch":{"tags":["internal"],"summary":"Update Cluster Timing","description":"Update cluster provisioning timing (internal).","operationId":"update_cluster_timing_internal_clusters__cluster_id__timing_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterTimingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/hetzner-project":{"patch":{"tags":["internal"],"summary":"Update Cluster Hetzner Project","description":"Update cluster with Hetzner project info (internal).","operationId":"update_cluster_hetzner_project_internal_clusters__cluster_id__hetzner_project_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterHetznerProjectUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/aws-info":{"patch":{"tags":["internal"],"summary":"Update Cluster Aws Info","description":"Update cluster with AWS-specific info for ArgoCD labels (internal).\n\nThese fields are used by ArgoCD ApplicationSets to configure:\n- AWS Load Balancer Controller with correct VPC ID\n- IRSA (IAM Roles for Service Accounts) for the LB controller","operationId":"update_cluster_aws_info_internal_clusters__cluster_id__aws_info_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterAwsInfoUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployment-metrics":{"post":{"tags":["internal"],"summary":"Record Deployment Metrics","description":"Record cluster deployment metrics for ETA calculations (internal).","operationId":"record_deployment_metrics_internal_deployment_metrics_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentMetricsCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployment-metrics/average":{"get":{"tags":["internal"],"summary":"Get Average Deployment Time","description":"Get average deployment time for a provider/tier combination (internal).","operationId":"get_average_deployment_time_internal_deployment_metrics_average_get","parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"query","required":true,"schema":{"type":"string","title":"Tier"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{provider}/{network_zone}":{"get":{"tags":["internal"],"summary":"Get Zone Infrastructure","description":"Get zone infrastructure by provider and network zone (internal).","operationId":"get_zone_infrastructure_internal_zone_infra__provider___network_zone__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"network_zone","in":"path","required":true,"schema":{"type":"string","title":"Network Zone"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{zone_infra_id}":{"get":{"tags":["internal"],"summary":"Get Zone Infrastructure By Id","description":"Get zone infrastructure by ID (internal).","operationId":"get_zone_infrastructure_by_id_internal_zone_infra__zone_infra_id__get","parameters":[{"name":"zone_infra_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Infra Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra":{"post":{"tags":["internal"],"summary":"Create Zone Infrastructure","description":"Create zone infrastructure (internal).","operationId":"create_zone_infrastructure_internal_zone_infra_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneInfraCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{zone_infra_id}/status":{"patch":{"tags":["internal"],"summary":"Update Zone Infra Status","description":"Update zone infrastructure status (internal).","operationId":"update_zone_infra_status_internal_zone_infra__zone_infra_id__status_patch","parameters":[{"name":"zone_infra_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Infra Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneInfraStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{zone_infra_id}/provisioned":{"patch":{"tags":["internal"],"summary":"Update Zone Infra Provisioned","description":"Update zone infrastructure with provisioned info (internal).","operationId":"update_zone_infra_provisioned_internal_zone_infra__zone_infra_id__provisioned_patch","parameters":[{"name":"zone_infra_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Infra Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZoneInfraProvisionedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{provider}/{network_zone}/allocate-subnet":{"post":{"tags":["internal"],"summary":"Allocate Subnet Index","description":"Allocate a subnet index for a new cluster (internal).","operationId":"allocate_subnet_index_internal_zone_infra__provider___network_zone__allocate_subnet_post","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"network_zone","in":"path","required":true,"schema":{"type":"string","title":"Network Zone"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{zone_infra_id}/nat-gateways/{location}":{"get":{"tags":["internal"],"summary":"Get Nat Gateway","description":"Get NAT gateway by zone and location (internal).","operationId":"get_nat_gateway_internal_zone_infra__zone_infra_id__nat_gateways__location__get","parameters":[{"name":"zone_infra_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Infra Id"}},{"name":"location","in":"path","required":true,"schema":{"type":"string","title":"Location"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/zone-infra/{zone_infra_id}/nat-gateways":{"post":{"tags":["internal"],"summary":"Create Nat Gateway","description":"Create a NAT gateway (internal).","operationId":"create_nat_gateway_internal_zone_infra__zone_infra_id__nat_gateways_post","parameters":[{"name":"zone_infra_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Zone Infra Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatGatewayCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/nat-gateways/{nat_gateway_id}/provisioned":{"patch":{"tags":["internal"],"summary":"Update Nat Gateway Provisioned","description":"Update NAT gateway with provisioned info (internal).","operationId":"update_nat_gateway_provisioned_internal_nat_gateways__nat_gateway_id__provisioned_patch","parameters":[{"name":"nat_gateway_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Nat Gateway Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatGatewayProvisionedUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/nat-gateways/{nat_gateway_id}/status":{"patch":{"tags":["internal"],"summary":"Update Nat Gateway Status","description":"Update NAT gateway status (internal).","operationId":"update_nat_gateway_status_internal_nat_gateways__nat_gateway_id__status_patch","parameters":[{"name":"nat_gateway_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Nat Gateway Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NatGatewayStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/drift-check-logs":{"post":{"tags":["internal"],"summary":"Record Drift Check Log","description":"Record drift check result for audit trail (internal).","operationId":"record_drift_check_log_internal_drift_check_logs_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DriftCheckLogCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cluster-registrations":{"post":{"tags":["internal"],"summary":"Create Cluster Registration","description":"Create a new cluster registration (internal).","operationId":"create_cluster_registration_internal_cluster_registrations_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterRegistrationCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cluster-registrations/{registration_id}":{"get":{"tags":["internal"],"summary":"Get Cluster Registration","description":"Get cluster registration by ID (internal).","operationId":"get_cluster_registration_internal_cluster_registrations__registration_id__get","parameters":[{"name":"registration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Registration Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cluster-registrations/{registration_id}/status":{"patch":{"tags":["internal"],"summary":"Update Registration Status","description":"Update cluster registration status (internal).","operationId":"update_registration_status_internal_cluster_registrations__registration_id__status_patch","parameters":[{"name":"registration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Registration Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistrationStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/{provider}/{region}":{"get":{"tags":["internal"],"summary":"Get Available Host Cluster","description":"Find an available host cluster for a given provider and region.\nReturns the ready host cluster with the fewest tenants. Hosts have no\ntenant ceiling: they autoscale, and every tenant has a fixed quota.","operationId":"get_available_host_cluster_internal_host_clusters__provider___region__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"path","required":true,"schema":{"type":"string","title":"Region"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters":{"get":{"tags":["internal"],"summary":"List Host Clusters","description":"List all host clusters, optionally filtered by provider.","operationId":"list_host_clusters_internal_host_clusters_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/{cluster_id}/increment":{"post":{"tags":["internal"],"summary":"Increment Host Cluster Usage","description":"Increment vCluster count on a host cluster (internal).","operationId":"increment_host_cluster_usage_internal_host_clusters__cluster_id__increment_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/{cluster_id}/decrement":{"post":{"tags":["internal"],"summary":"Decrement Host Cluster Usage","description":"Decrement vCluster count on a host cluster (internal).","operationId":"decrement_host_cluster_usage_internal_host_clusters__cluster_id__decrement_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/vcluster-info":{"patch":{"tags":["internal"],"summary":"Update Cluster Vcluster Info","description":"Update cluster with vCluster info (internal).","operationId":"update_cluster_vcluster_info_internal_clusters__cluster_id__vcluster_info_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VClusterInfoUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/request":{"post":{"tags":["internal"],"summary":"Request Host Cluster","description":"Request creation of a host cluster for a provider/region.\nIf one is already being provisioned, returns that. Otherwise creates a new one.","operationId":"request_host_cluster_internal_host_clusters_request_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostClusterCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/{cluster_id}/mark-ready":{"post":{"tags":["internal"],"summary":"Mark Host Cluster Ready","description":"Mark a host cluster as ready for vCluster scheduling.","operationId":"mark_host_cluster_ready_internal_host_clusters__cluster_id__mark_ready_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/enable-host-cluster":{"post":{"tags":["internal"],"summary":"Enable Host Cluster Capabilities","description":"Enable host cluster capabilities on an existing cluster.\n\nThis allows any running cluster (including management clusters) to host vClusters.\nCreates a HostClusterCapacity record if one doesn't exist.","operationId":"enable_host_cluster_capabilities_internal_clusters__cluster_id__enable_host_cluster_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/idle":{"get":{"tags":["internal"],"summary":"List Idle Host Clusters","description":"List host clusters that have been idle (no vClusters) for more than idle_hours.\nUsed by the cleanup job to identify clusters to delete.\n\nAlso reconciles stale current_vclusters counters by checking actual vCluster\nrecords in the database, preventing clusters from being missed by cleanup.","operationId":"list_idle_host_clusters_internal_host_clusters_idle_get","parameters":[{"name":"idle_hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Idle Hours"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/host-clusters/{cluster_id}":{"get":{"tags":["internal"],"summary":"Get Host Cluster","description":"Get a specific host cluster's capacity info.","operationId":"get_host_cluster_internal_host_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["internal"],"summary":"Delete Host Cluster","description":"Delete an idle host cluster.\nOnly allows deletion if the host cluster has no active vClusters.","operationId":"delete_host_cluster_internal_host_clusters__cluster_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/hetzner-projects/allocate/{cluster_id}":{"post":{"tags":["internal"],"summary":"Allocate Hetzner Project Endpoint","description":"Allocate an available Hetzner project to a cluster.\nProjects are defined in HETZNER_PROJECTS environment variable.\nReturns the project details including the API token for CCM.","operationId":"allocate_hetzner_project_endpoint_internal_hetzner_projects_allocate__cluster_id__post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/provision-deployments":{"post":{"tags":["internal"],"summary":"Provision Pending Deployments","description":"Provision all pending/stuck deployments on a cluster.\nCalled by the worker after cluster provisioning completes.\nAlso handles deployments stuck in PROVISIONING status (e.g., from failed previous attempts).","operationId":"provision_pending_deployments_internal_clusters__cluster_id__provision_deployments_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/provision-databases":{"post":{"tags":["internal"],"summary":"Provision Pending Databases","description":"Provision all pending databases on a cluster.\nCalled by the worker once the cluster is RUNNING and registered with\nArgoCD (so its operator label can be set). Databases created against a\nstill-provisioning cluster stay PENDING until this fires.\n\nReplicas are skipped — they stay PENDING until their primary is RUNNING\nand are provisioned via /databases/{id}/provision-replica.","operationId":"provision_pending_databases_internal_clusters__cluster_id__provision_databases_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/pending-on-ready-clusters":{"get":{"tags":["internal"],"summary":"Get Pending Databases On Ready Clusters","description":"Return distinct cluster IDs that are RUNNING and have at least one PENDING\nnon-replica database waiting to be provisioned.\n\nThe worker's database status-sync reconcile polls this and calls\n/clusters/{id}/provision-databases for each, so a pending database is\npicked up no matter how/when its cluster became ready (fresh provision,\nimport, drift) — replacing the one-shot trigger in the provisioning task.","operationId":"get_pending_databases_on_ready_clusters_internal_databases_pending_on_ready_clusters_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployments/provisioning":{"get":{"tags":["internal"],"summary":"Get Provisioning Deployments","description":"Get all deployments in PROVISIONING or ERROR status.\n\nUsed by the deployment status sync job to find deployments\nwaiting for ArgoCD to deploy them, or ERROR deployments that\nmay have recovered and should be transitioned to RUNNING.","operationId":"get_provisioning_deployments_internal_deployments_provisioning_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/usage/clusters":{"post":{"tags":["internal"],"summary":"Record Cluster Usage","description":"Record per-second usage for clusters (dedicated and shared tiers).\nThis endpoint is called by the worker's hourly usage scraping job.\n\nPer-second billing (like AWS/GCP/Azure):\n- Minimum charge: 60 seconds (1 minute)\n- Billed per second after the first minute\n\nFor each cluster, records a UsageRecord with the per-second cost based on:\n- Provider (hetzner, gcp, aws, azure)\n- Tier (shared, testing, production)","operationId":"record_cluster_usage_internal_usage_clusters_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterUsageBatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/hetzner-projects/release/{cluster_id}":{"post":{"tags":["internal"],"summary":"Release Hetzner Project","description":"Release a Hetzner project back to the pool when a cluster is deleted.\nSince projects are tracked via cluster.hetzner_project_id, releasing means\nclearing that field (or the cluster being deleted entirely).","operationId":"release_hetzner_project_internal_hetzner_projects_release__cluster_id__post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployments/{deployment_id}":{"delete":{"tags":["internal"],"summary":"Delete Internal Deployment","description":"Finalize deletion: remove the deployment DB record. This is a SERVICE-ONLY\noperation the worker calls AFTER it has torn the deployment down (git removal\n-> ArgoCD prune). It is distinct from the user-facing public DELETE, which\nonly *initiates* deletion (sets DELETING + enqueues this teardown).","operationId":"delete_internal_deployment_internal_deployments__deployment_id__delete","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployments/{deployment_id}/status":{"patch":{"tags":["internal"],"summary":"Update Deployment Status","description":"Update deployment status (internal).","operationId":"update_deployment_status_internal_deployments__deployment_id__status_patch","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/component-health":{"get":{"tags":["internal"],"summary":"Get Cluster Component Health","description":"Check health of ArgoCD component bundle apps for a cluster (internal).\n\nReturns the sync/health status of critical apps (external-secrets, cert-manager,\ncnpg-operator) by querying ArgoCD on the management cluster.","operationId":"get_cluster_component_health_internal_clusters__cluster_id__component_health_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployments/{deployment_id}/endpoint":{"patch":{"tags":["internal"],"summary":"Update Deployment Endpoint","description":"Update deployment endpoint URL (internal).","operationId":"update_deployment_endpoint_internal_deployments__deployment_id__endpoint_patch","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentEndpointUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployments/{deployment_id}/execute-promotion":{"post":{"tags":["internal"],"summary":"Execute Deployment Promotion","description":"Execute deployment promotion (internal, called by worker).\n\nThis endpoint is called by the worker to perform the actual promotion:\n- Copy configuration from source deployment\n- Copy secrets\n- Generate values.yaml\n- Sync to Git\n- Update deployment status","operationId":"execute_deployment_promotion_internal_deployments__deployment_id__execute_promotion_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecutePromotionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployments/{deployment_id}/sync-to-git":{"post":{"tags":["internal"],"summary":"Sync Deployment To Git Internal","description":"Sync deployment values.yaml to Git (internal, called by worker).\n\nThis endpoint:\n- Updates the deployment's values.yaml\n- Syncs to the Git repository\n- Updates git_sync_status and deployment status","operationId":"sync_deployment_to_git_internal_internal_deployments__deployment_id__sync_to_git_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncDeploymentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/subscriptions-due":{"get":{"tags":["internal"],"summary":"Get Subscriptions Due For Billing","description":"Get subscriptions that need billing collection today.","operationId":"get_subscriptions_due_for_billing_internal_billing_subscriptions_due_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/collect/{subscription_id}":{"post":{"tags":["internal"],"summary":"Collect Subscription Billing","description":"Trigger billing collection for a specific subscription.","operationId":"collect_subscription_billing_internal_billing_collect__subscription_id__post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/credit-warnings":{"get":{"tags":["internal"],"summary":"Get Subscriptions Needing Warnings","description":"Get subscriptions that need credit warning emails.","operationId":"get_subscriptions_needing_warnings_internal_billing_credit_warnings_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/record-warning/{subscription_id}":{"post":{"tags":["internal"],"summary":"Record Warning Sent","description":"Record that a warning was sent (for deduplication) and send the email.","operationId":"record_warning_sent_internal_billing_record_warning__subscription_id__post","parameters":[{"name":"subscription_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Subscription Id"}},{"name":"threshold","in":"query","required":true,"schema":{"type":"integer","title":"Threshold"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/suspend":{"post":{"tags":["internal"],"summary":"Trigger Suspension Check","description":"Check and suspend accounts with exhausted credit (incl. spent trials).","operationId":"trigger_suspension_check_internal_billing_suspend_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/deletion-due":{"get":{"tags":["internal"],"summary":"Get Accounts Due For Deletion","description":"Get suspended accounts past their deletion deadline.","operationId":"get_accounts_due_for_deletion_internal_billing_deletion_due_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/delete-resources/{user_id}":{"post":{"tags":["internal"],"summary":"Delete User Resources","description":"Delete all resources for a user (called after grace period).","operationId":"delete_user_resources_internal_billing_delete_resources__user_id__post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/billing/delete-org-resources/{organization_id}":{"post":{"tags":["internal"],"summary":"Delete Org Resources","description":"Delete all resources owned by an organization (called after grace period).","operationId":"delete_org_resources_internal_billing_delete_org_resources__organization_id__post","parameters":[{"name":"organization_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Organization Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/users/deletion-requests-due":{"get":{"tags":["internal"],"summary":"Get Deletion Requests Due","description":"Get users whose account deletion grace period has expired.","operationId":"get_deletion_requests_due_internal_users_deletion_requests_due_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/users/{user_id}/process-deletion":{"post":{"tags":["internal"],"summary":"Process User Deletion","description":"Process a user account deletion: remove credentials, the personal\norganization and the user row (see account_deletion_service).\n\nReturns ``deleted: false`` with ``blocked_by`` when the account still\nowns infrastructure or money is outstanding; the worker retries daily.","operationId":"process_user_deletion_internal_users__user_id__process_deletion_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/byoc-credentials":{"get":{"tags":["internal"],"summary":"Get Byoc Credentials","description":"Get BYOC credentials for a cluster (internal API only).\n\nThis endpoint fetches decrypted cloud credentials from OpenBao for clusters\nthat use customer-provided credentials (is_byoc=True).","operationId":"get_byoc_credentials_internal_clusters__cluster_id__byoc_credentials_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cloud-credentials/{credential_id}/status":{"patch":{"tags":["internal"],"summary":"Update Credential Status","description":"Update cloud credential status (internal API only).\n\nUsed by the worker to update credential status during MicroOS image provisioning.","operationId":"update_credential_status_internal_cloud_credentials__credential_id__status_patch","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cloud-credentials/{credential_id}":{"get":{"tags":["internal"],"summary":"Get Credential","description":"Get cloud credential details (internal API only).\n\nReturns credential metadata (not secrets).","operationId":"get_credential_internal_cloud_credentials__credential_id__get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cloud-credentials/{credential_id}/secrets":{"get":{"tags":["internal"],"summary":"Get Credential Secrets","description":"Get cloud credential secrets from OpenBao (internal API only).\n\nReturns decrypted secrets for the credential.","operationId":"get_credential_secrets_internal_cloud_credentials__credential_id__secrets_get","parameters":[{"name":"credential_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Credential Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/cloud-credentials/provider/hetzner":{"get":{"tags":["internal"],"summary":"Get Hetzner Credentials","description":"Get all Hetzner cloud credentials (internal API only).\n\nUsed by the MicroOS image sync job to provision images in all Hetzner projects.","operationId":"get_hetzner_credentials_internal_cloud_credentials_provider_hetzner_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/upgrade-requests/{upgrade_request_id}":{"get":{"tags":["internal"],"summary":"Get Upgrade Request","description":"Get an upgrade request by ID (internal).","operationId":"get_upgrade_request_internal_upgrade_requests__upgrade_request_id__get","parameters":[{"name":"upgrade_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Request Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/upgrade-requests/{upgrade_request_id}/status":{"patch":{"tags":["internal"],"summary":"Update Upgrade Request Status","description":"Update an upgrade request status (internal).","operationId":"update_upgrade_request_status_internal_upgrade_requests__upgrade_request_id__status_patch","parameters":[{"name":"upgrade_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Request Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/upgrades/execute-due":{"post":{"tags":["internal"],"summary":"Execute Due Upgrades","description":"Execute all scheduled upgrades that are due.\nCalled hourly by the worker scheduled job.","operationId":"execute_due_upgrades_internal_upgrades_execute_due_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/upgrades/send-reminders":{"post":{"tags":["internal"],"summary":"Send Upgrade Reminders","description":"Send reminder emails for upcoming scheduled upgrades.\nCalled daily by the worker scheduled job.\nSends reminders at 7 days and 1 day before scheduled date.","operationId":"send_upgrade_reminders_internal_upgrades_send_reminders_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/versions/discover":{"post":{"tags":["internal"],"summary":"Record Version Discovery","description":"Record a newly discovered Kubernetes version.\nCalled by the worker version polling job when a new version is found.\nIf is_new_default is True, schedules upgrades for affected clusters.","operationId":"record_version_discovery_internal_versions_discover_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VersionDiscoveryData"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/mcp-call-logs/purge-expired":{"post":{"tags":["internal"],"summary":"Purge Expired Mcp Call Logs","description":"Delete MCP call log rows past their retention window (worker only).","operationId":"purge_expired_mcp_call_logs_internal_mcp_call_logs_purge_expired_post","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/database-archives/due":{"get":{"tags":["internal"],"summary":"List Due Database Archives","description":"WAL archives retired by in-place restores and past retention (worker only).","operationId":"list_due_database_archives_internal_database_archives_due_get","parameters":[{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/database-archives/{archive_id}/purged":{"post":{"tags":["internal"],"summary":"Mark Database Archive Purged","description":"Record that the worker purged a retired archive; drops its backups (worker only).","operationId":"mark_database_archive_purged_internal_database_archives__archive_id__purged_post","parameters":[{"name":"archive_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Archive Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/status":{"get":{"tags":["internal"],"summary":"Get Database Status","description":"A managed database's current status (worker only).\n\nThe worker checks it before committing a queued manifest: while a\nrestore runs, the restore owns the database's manifest in git.","operationId":"get_database_status_internal_databases__database_id__status_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["internal"],"summary":"Update Database Status","description":"Update the status of a managed database instance (worker only).\n\nResponds 409 when ``expected_status`` does not match, and for any update\nof a RESTORING database that does not come from the restore job (a\nstatus sync that listed the database before the restore started).\nAn empty ``error_message`` clears it.","operationId":"update_database_status_internal_databases__database_id__status_patch","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/backups/sync":{"put":{"tags":["internal"],"summary":"Sync Database Backups Endpoint","description":"Mirror the cluster's Backup objects into database_backups (worker only).\n\nCalled hourly by database.sync-backups with the complete list of Backup\nobjects for the database, so scheduled operator backups show up next to\nmanual ones and retention-pruned backups disappear.","operationId":"sync_database_backups_endpoint_internal_databases__database_id__backups_sync_put","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupSyncRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/backups/{backup_id}/status":{"patch":{"tags":["internal"],"summary":"Update Backup Status","description":"Update the status of a database backup (worker only).","operationId":"update_backup_status_internal_backups__backup_id__status_patch","parameters":[{"name":"backup_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Backup Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/provisioning":{"get":{"tags":["internal"],"summary":"Get Provisioning Databases","description":"Get all databases in PROVISIONING, ERROR, or RUNNING status.\n\nUsed by the database status sync job to:\n- Find databases waiting for ArgoCD to deploy them (PROVISIONING)\n- Check if ERROR databases have recovered\n- Re-sync credentials for RUNNING databases (PXC operators may\n  regenerate secrets after initial sync)","operationId":"get_provisioning_databases_internal_databases_provisioning_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}":{"delete":{"tags":["internal"],"summary":"Delete Database Record","description":"Delete a managed database instance record (worker only).","operationId":"delete_database_record_internal_databases__database_id__delete","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/replication-host":{"patch":{"tags":["internal"],"summary":"Update Replication Host","description":"Store the replication LoadBalancer IP for a primary database (worker only).","operationId":"update_replication_host_internal_databases__database_id__replication_host_patch","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationHostUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/backups":{"post":{"tags":["internal"],"summary":"Request Database Backup","description":"Take a manual backup of a running database (worker only).\n\nUsed after a cluster changes organization: the backup path moved to the\nnew organization's bucket, which has no base backup yet.","operationId":"request_database_backup_internal_databases__database_id__backups_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/clone":{"post":{"tags":["internal"],"summary":"Clone Database","description":"Copy a database onto another cluster, restored from its backups (worker only).\n\nA deployment migration calls this for every managed database the moved\ndeployment uses. The copy is provisioned right away; the caller polls\nits status through the provisioning list.","operationId":"clone_database_internal_databases__database_id__clone_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseCloneRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/clusters/{cluster_id}/adopted-deployments/{namespace}/environment":{"patch":{"tags":["internal"],"summary":"Set Adopted Deployment Environment","description":"Record the environment of a deployment imported from a namespace (worker only).\n\nDiscovery does not capture environment variables, so a migrated\ndeployment's record would lose its secret references at the first edit.","operationId":"set_adopted_deployment_environment_internal_clusters__cluster_id__adopted_deployments__namespace__environment_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdoptedDeploymentEnvironmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/provision-replica":{"post":{"tags":["internal"],"summary":"Provision Replica","description":"Generate CRD for a replica and trigger its provisioning (worker only).\n\nCalled by status sync when the primary is RUNNING and its replication LB\nIP is known. The replica's replication_host is set to the primary's\nreplication LB IP before generating the CRD.","operationId":"provision_replica_internal_databases__database_id__provision_replica_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/databases/{database_id}/enable-replication":{"post":{"tags":["internal"],"summary":"Enable Replication Channels","description":"Phase 2 of MySQL replica setup: add replication channels to a RUNNING replica.\n\nThe PXC operator panics if replicationChannels are configured before\nstatus.pxc.version is populated.  So replicas deploy without channels\nfirst (phase 1), then this endpoint regenerates the CRD with channels\nafter the cluster is healthy.","operationId":"enable_replication_channels_internal_databases__database_id__enable_replication_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/replication-groups/{group_id}/pending-replicas":{"get":{"tags":["internal"],"summary":"Get Pending Replicas","description":"Get replicas in PENDING status for a replication group (worker only).","operationId":"get_pending_replicas_internal_replication_groups__group_id__pending_replicas_get","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/users/{user_id}/ensure-subscription":{"post":{"tags":["internal"],"summary":"Ensure Subscription","description":"Ensure a user has an active subscription (for integration tests).","operationId":"ensure_subscription_internal_users__user_id__ensure_subscription_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Data"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/migrations/{migration_id}":{"get":{"tags":["internal"],"summary":"Get Migration Internal","description":"Get a namespace migration by ID (internal).","operationId":"get_migration_internal_internal_migrations__migration_id__get","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/migrations/{migration_id}/status":{"patch":{"tags":["internal"],"summary":"Update Migration Status","description":"Update namespace migration status/progress (internal).","operationId":"update_migration_status_internal_migrations__migration_id__status_patch","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/migrations/{migration_id}/backup-info":{"patch":{"tags":["internal"],"summary":"Update Migration Backup Info","description":"Store Velero backup metadata on a migration (internal).","operationId":"update_migration_backup_info_internal_migrations__migration_id__backup_info_patch","parameters":[{"name":"migration_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Migration Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MigrationBackupInfo"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/deployment-restores/{restore_id}":{"get":{"tags":["internal"],"summary":"Get Deployment Restore Internal","description":"Get a deployment restore by ID (internal).","operationId":"get_deployment_restore_internal_internal_deployment_restores__restore_id__get","parameters":[{"name":"restore_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Restore Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentRestoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["internal"],"summary":"Update Deployment Restore Internal","description":"Record restore progress reported by the worker (internal).","operationId":"update_deployment_restore_internal_internal_deployment_restores__restore_id__patch","parameters":[{"name":"restore_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Restore Id"}},{"name":"x-service-token","in":"header","required":true,"schema":{"type":"string","title":"X-Service-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentRestoreUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentRestoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/internal/alerts/webhook":{"post":{"tags":["internal"],"summary":"Receive Alertmanager Webhook","description":"Deliver alerts from a customer alert rule to the rule's notification channels.\n\nCustom rules are loaded in the Mimir ruler with a ``mengi_rule_id`` label\n(see services/alert_rule_sync); the platform Alertmanager routes every\nalert carrying that label here. Alerts without it (platform alerts) are\nignored. Delivery failures are logged per channel and never fail the\nwhole batch, so one dead webhook does not block an email.","operationId":"receive_alertmanager_webhook_internal_alerts_webhook_post","parameters":[{"name":"x-service-token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Service-Token"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertmanagerWebhook"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/providers":{"get":{"tags":["authentication"],"summary":"List Providers","description":"Return which OAuth providers are available for login.","operationId":"list_providers_auth_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/{provider}/login":{"get":{"tags":["authentication"],"summary":"Oauth Login","operationId":"oauth_login_auth__provider__login_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/{provider}/callback":{"get":{"tags":["authentication"],"summary":"Oauth Callback","operationId":"oauth_callback_auth__provider__callback_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/logout":{"post":{"tags":["authentication"],"summary":"Logout","operationId":"logout_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/auth/login":{"post":{"tags":["authentication"],"summary":"Login","description":"Login with email and password","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["authentication"],"summary":"Get Me","operationId":"get_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}}}},"/auth/stop-impersonating":{"post":{"tags":["authentication"],"summary":"Stop Impersonating","description":"Restore the admin's original session cookie after impersonation.","operationId":"stop_impersonating_auth_stop_impersonating_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/users/me":{"get":{"tags":["users"],"summary":"Get Current User Profile","operationId":"get_current_user_profile_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}}},"patch":{"tags":["users"],"summary":"Update Current User","operationId":"update_current_user_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/me/request-deletion":{"post":{"tags":["users"],"summary":"Request Account Deletion","operationId":"request_account_deletion_users_me_request_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/users/me/cancel-deletion":{"post":{"tags":["users"],"summary":"Cancel Account Deletion","operationId":"cancel_account_deletion_users_me_cancel_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/clusters/estimated-times":{"get":{"tags":["clusters"],"summary":"Get Estimated Creation Times","description":"Get estimated cluster creation times based on historical data.\n\nFor shared tier, also returns whether a host cluster is available\nwhich significantly affects creation time.","operationId":"get_estimated_creation_times_clusters_estimated_times_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"query","required":false,"schema":{"type":"string","title":"Tier"}},{"name":"geographic_region","in":"query","required":false,"schema":{"type":"string","title":"Geographic Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters":{"get":{"tags":["clusters"],"summary":"List Clusters","description":"List all clusters for the current user (excludes management and host clusters).\n\nFor shared tier clusters (vClusters), fetches real-time status from ArgoCD\nto ensure the UI always reflects the actual cluster state.","operationId":"list_clusters_clusters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterListResponse"}}}}}},"post":{"tags":["clusters"],"summary":"Create Cluster","description":"Create a new Kubernetes cluster.","operationId":"create_cluster_clusters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/preflight-import":{"post":{"tags":["clusters"],"summary":"Preflight Import","description":"Inspect a candidate cluster for collisions before importing it.\n\nReturns a list of detected resource collisions (CRDs, IngressClasses,\npre-existing namespaces, etc.) so the caller can decide whether the\nimport is safe to proceed.\n\nRead-only — no DB mutations, no cluster creation.","operationId":"preflight_import_clusters_preflight_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightImportRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreflightImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/import":{"post":{"tags":["clusters"],"summary":"Import Cluster","description":"Import an existing Kubernetes cluster into Mengi Cloud.\n\nRuns preflight first and refuses the import if any error-severity\nconflicts are detected. Setting ``override_preflight=true`` lets an\nadmin force the import; every override is logged with the user id.","operationId":"import_cluster_clusters_import_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterImport"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}":{"get":{"tags":["clusters"],"summary":"Get Cluster","description":"Get a specific cluster.","operationId":"get_cluster_clusters__cluster_id__get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["clusters"],"summary":"Delete Cluster","description":"Delete a cluster.","operationId":"delete_cluster_clusters__cluster_id__delete","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/kubeconfig":{"get":{"tags":["clusters"],"summary":"Download Cluster Kubeconfig","description":"Download the kubeconfig for a cluster the user administers.\n\nHands out full cluster access, so org clusters require the ADMIN role\n(same gate as autoscaling changes). Management clusters are only\ndownloadable through the platform-admin endpoint.","operationId":"download_cluster_kubeconfig_clusters__cluster_id__kubeconfig_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/autoscaling":{"patch":{"tags":["clusters"],"summary":"Update Cluster Autoscaling","description":"Update autoscaling configuration for a cluster.\n\nThis endpoint allows enabling/disabling autoscaling and adjusting\nmin/max node counts. Changes take effect on the next scaling event.\n\nNote: For vClusters (shared tier), autoscaling is managed at the\nhost cluster level, not per-vCluster.","operationId":"update_cluster_autoscaling_clusters__cluster_id__autoscaling_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoscalingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/region-locations":{"patch":{"tags":["clusters"],"summary":"Update Cluster Region Locations","description":"Update multi-region locations for a Hetzner production cluster.\n\nChanges which eu-central datacenters worker nodes are distributed across.\nThis triggers a Pulumi update that may recreate servers in new locations.","operationId":"update_cluster_region_locations_clusters__cluster_id__region_locations_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegionLocationsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/server-type":{"patch":{"tags":["clusters"],"summary":"Update Cluster Server Type","description":"Change a cluster's node machine (server) type in place.\n\nThe worker adds a node pool of the requested type next to the current\none, cordons and drains the old nodes one at a time, then removes the\nold pool. The cluster's control plane and persistent volumes survive and\nworkloads move gradually rather than all at once. This is distinct from\n`tier`, which is immutable and cannot be changed without recreating the\ncluster.","operationId":"update_cluster_server_type_clusters__cluster_id__server_type_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/server-type/retry":{"post":{"tags":["clusters"],"summary":"Retry Cluster Server Type","description":"Resume a node-type change that did not complete.\n\nRe-queues the rollover for the cluster's current server type. The\nworker works out which nodes are still on the old type from the nodes\nthemselves and keeps any replacement nodes that already came up, so a\nretry continues where the previous attempt stopped.","operationId":"retry_cluster_server_type_clusters__cluster_id__server_type_retry_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/component-bundle":{"patch":{"tags":["clusters"],"summary":"Update Cluster Component Bundle","description":"Update the component bundle channel for a cluster.\n\nThe component bundle determines which version of cluster components\n(cert-manager, traefik, etc.) are deployed via ArgoCD ApplicationSets.\n\nValid values:\n- 'stable': the platform-blessed release (recommended)\n- 'latest': always the newest component versions\n\nThe change is applied by re-stamping the cluster's registration; it\ntakes effect within a few minutes.","operationId":"update_cluster_component_bundle_clusters__cluster_id__component_bundle_patch","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/retry":{"post":{"tags":["clusters"],"summary":"Retry Cluster","description":"Retry provisioning a failed cluster with a new region.\nOnly works for clusters in ERROR status.","operationId":"retry_cluster_clusters__cluster_id__retry_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterRetry"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/drift-check":{"post":{"tags":["clusters"],"summary":"Check Cluster Drift","description":"Trigger drift detection and correction for a specific cluster.","operationId":"check_cluster_drift_clusters__cluster_id__drift_check_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/drift-check-all":{"post":{"tags":["clusters"],"summary":"Check All Clusters Drift","description":"Trigger drift detection and correction for all running clusters.\nThis is an admin operation - typically run via scheduled job.","operationId":"check_all_clusters_drift_clusters_drift_check_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/clusters/{cluster_id}/resources":{"get":{"tags":["clusters"],"summary":"List Cluster Resources","description":"List a cluster's Kubernetes resources of one kind (paginated).","operationId":"list_cluster_resources_clusters__cluster_id__resources_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"kind","in":"query","required":true,"schema":{"type":"string","description":"Resource kind (nodes, pods, services, deployments, statefulsets, daemonsets, ingresses)","title":"Kind"},"description":"Resource kind (nodes, pods, services, deployments, statefulsets, daemonsets, ingresses)"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"include_system","in":"query","required":false,"schema":{"type":"boolean","description":"Include system namespaces","default":false,"title":"Include System"},"description":"Include system namespaces"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/capacity-check":{"post":{"tags":["clusters"],"summary":"Check Cluster Capacity","description":"Tell, before creating or resizing a workload, whether it fits on a\nshared cluster.\n\nShared clusters cap the CPU and memory requests of everything in the\ntenant; a pod over the cap is rejected at admission and ends up as a\nfailed deployment or database. This answers the same question up front\nfrom the tenant's live quota. For dedicated clusters and clusters that\nare not running yet `applies` is false.","operationId":"check_cluster_capacity_clusters__cluster_id__capacity_check_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityCheckRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CapacityCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/metrics":{"get":{"tags":["clusters"],"summary":"Get Cluster Metrics","description":"Get real-time metrics for a cluster including node status, resource usage,\nworkloads, and cost information.\n\nWorks for both dedicated clusters and vClusters.","operationId":"get_cluster_metrics_clusters__cluster_id__metrics_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/deployment-eta/{provider}/{tier}":{"get":{"tags":["clusters"],"summary":"Get Deployment Eta","description":"Get estimated deployment time for a provider/tier combination.\nReturns average time based on historical data, or defaults if no data available.","operationId":"get_deployment_eta_clusters_deployment_eta__provider___tier__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"path","required":true,"schema":{"type":"string","title":"Tier"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/upgrades/available":{"get":{"tags":["clusters"],"summary":"Get Available Upgrades","description":"Check if Kubernetes version upgrades are available for this cluster.\nReturns the current version and list of available upgrade versions.","operationId":"get_available_upgrades_clusters__cluster_id__upgrades_available_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeAvailableResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/upgrades":{"get":{"tags":["clusters"],"summary":"List Upgrade Requests","description":"List all upgrade requests for a cluster.\nReturns upgrade history including pending, completed, and failed upgrades.","operationId":"list_upgrade_requests_clusters__cluster_id__upgrades_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UpgradeRequestResponse"},"title":"Response List Upgrade Requests Clusters  Cluster Id  Upgrades Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/upgrades/request":{"post":{"tags":["clusters"],"summary":"Request Upgrade","description":"Request a Kubernetes version upgrade for the cluster.\nCreates a pending upgrade request that requires approval.","operationId":"request_upgrade_clusters__cluster_id__upgrades_request_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/upgrades/{upgrade_id}/approve":{"post":{"tags":["clusters"],"summary":"Approve Upgrade","description":"Approve and start a pending upgrade request.\nThis triggers the actual upgrade process.","operationId":"approve_upgrade_clusters__cluster_id__upgrades__upgrade_id__approve_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"upgrade_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/upgrades/{upgrade_id}/cancel":{"post":{"tags":["clusters"],"summary":"Cancel Upgrade","description":"Cancel a pending upgrade request.\nCannot cancel upgrades that are already in progress.","operationId":"cancel_upgrade_clusters__cluster_id__upgrades__upgrade_id__cancel_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"upgrade_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/upgrades/{upgrade_id}/trigger-now":{"post":{"tags":["clusters"],"summary":"Trigger Upgrade Now","description":"Trigger immediate execution of a scheduled upgrade.\n\nThis allows users to update their cluster before the scheduled date.\nOnly works for pending upgrades (not already in progress).","operationId":"trigger_upgrade_now_clusters__cluster_id__upgrades__upgrade_id__trigger_now_post","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"upgrade_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Upgrade Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeRequestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/reorder":{"post":{"tags":["clusters"],"summary":"Reorder Clusters","description":"Reorder clusters on the dashboard.\n\nUpdates the display_order for all clusters based on their position\nin the provided cluster_ids list.","operationId":"reorder_clusters_clusters_reorder_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterReorderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/workloads/discover":{"get":{"tags":["clusters"],"summary":"Discover Cluster Workloads","description":"Discover running workloads in a cluster.\n\nScans the cluster for Helm releases and K8s workloads (Deployments,\nStatefulSets, DaemonSets) and returns them for import selection.\nUsers may only scan imported clusters; the service principal (worker)\nmay scan any cluster, e.g. a migration target after a Velero restore.","operationId":"discover_cluster_workloads_clusters__cluster_id__workloads_discover_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"namespace","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Only return workloads in this namespace","title":"Namespace"},"description":"Only return workloads in this namespace"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveredWorkloadListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/namespaces":{"get":{"tags":["clusters"],"summary":"List Cluster Namespaces","description":"List user namespaces on a cluster (candidates for namespace migration).","operationId":"list_cluster_namespaces_clusters__cluster_id__namespaces_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/namespaces/{namespace}/summary":{"get":{"tags":["clusters"],"summary":"Get Cluster Namespace Summary","description":"Summarize a namespace's workloads and PVCs for migration review.","operationId":"get_cluster_namespace_summary_clusters__cluster_id__namespaces__namespace__summary_get","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}},{"name":"namespace","in":"path","required":true,"schema":{"type":"string","title":"Namespace"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NamespaceSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clusters/{cluster_id}/dns-credential":{"put":{"tags":["clusters"],"summary":"Set Cluster Dns Credential","description":"Attach a DNS credential to a cluster (or detach with a null id) so the\nper-cluster external-dns manages that credential's domain (BYOC DNS, Phase 3).","operationId":"set_cluster_dns_credential_clusters__cluster_id__dns_credential_put","parameters":[{"name":"cluster_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cluster Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetClusterDNSCredential"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/oauth/revoke":{"post":{"tags":["oauth"],"summary":"Revoke","operationId":"revoke_oauth_revoke_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_revoke_oauth_revoke_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["oauth"],"summary":"Oauth Preflight","operationId":"oauth_preflight_oauth_revoke_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/token":{"post":{"tags":["oauth"],"summary":"Token","operationId":"token_oauth_token_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_token_oauth_token_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["oauth"],"summary":"Oauth Preflight","operationId":"oauth_preflight_oauth_token_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/register":{"post":{"tags":["oauth"],"summary":"Register Client","operationId":"register_client_oauth_register_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"tags":["oauth"],"summary":"Oauth Preflight","operationId":"oauth_preflight_oauth_register_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server":{"get":{"tags":["oauth"],"summary":"Authorization Server Metadata","operationId":"authorization_server_metadata__well_known_oauth_authorization_server_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"options":{"tags":["oauth"],"summary":"Oauth Preflight","operationId":"oauth_preflight__well_known_oauth_authorization_server_options","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oauth-authorization-server/{path}":{"get":{"tags":["oauth"],"summary":"Authorization Server Metadata","operationId":"authorization_server_metadata__well_known_oauth_authorization_server__path__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/oauth/authorize":{"get":{"tags":["oauth"],"summary":"Authorize","operationId":"authorize_oauth_authorize_get","parameters":[{"name":"response_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Type"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"redirect_uri","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"code_challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge"}},{"name":"code_challenge_method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Challenge Method"}},{"name":"resource","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["oauth"],"summary":"Authorize Submit","operationId":"authorize_submit_oauth_authorize_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_authorize_submit_oauth_authorize_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/inspect-helm-chart":{"post":{"tags":["deployments"],"summary":"Inspect Helm Chart","description":"Inspect a Helm chart and return its metadata and resource requirements.\n\nThis endpoint fetches the chart from the repository, extracts Chart.yaml\nand values.yaml, and returns the chart info including default resource specs.","operationId":"inspect_helm_chart_deployments_inspect_helm_chart_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HelmChartInspectRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/helm-chart-versions":{"get":{"tags":["deployments"],"summary":"List Helm Chart Versions","description":"List available versions for a Helm chart.","operationId":"list_helm_chart_versions_deployments_helm_chart_versions_get","parameters":[{"name":"repo_url","in":"query","required":true,"schema":{"type":"string","title":"Repo Url"}},{"name":"chart_name","in":"query","required":true,"schema":{"type":"string","title":"Chart Name"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/app-hosting/geographic-regions":{"get":{"tags":["deployments"],"summary":"Get Geographic Regions","description":"Get available geographic regions for shared tier clusters.\nReturns regions based on the selected cloud provider.","operationId":"get_geographic_regions_deployments_app_hosting_geographic_regions_get","parameters":[{"name":"provider","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cloud provider (hetzner, aws, gcp, azure). Defaults to hetzner.","title":"Provider"},"description":"Cloud provider (hetzner, aws, gcp, azure). Defaults to hetzner."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/app-hosting/kubernetes-versions":{"get":{"tags":["deployments"],"summary":"Get App Hosting Kubernetes Versions","description":"Get supported Kubernetes (k3s) versions for App Hosting shared clusters.\n\nFetches versions from GitHub releases (k3s-io/k3s) with caching.","operationId":"get_app_hosting_kubernetes_versions_deployments_app_hosting_kubernetes_versions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/deployments/app-hosting/availability":{"get":{"tags":["deployments"],"summary":"Check App Hosting Availability","description":"Check if App Hosting is available for the given provider/region.\n\nApp Hosting deployments run on vClusters which require a host cluster.\nThis endpoint checks if a host cluster exists and is ready.","operationId":"check_app_hosting_availability_deployments_app_hosting_availability_get","parameters":[{"name":"provider","in":"query","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"query","required":true,"schema":{"type":"string","title":"Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments":{"get":{"tags":["deployments"],"summary":"List Deployments","operationId":"list_deployments_deployments_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"cluster_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cluster Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/DeploymentStatus"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["deployments"],"summary":"Create Deployment","operationId":"create_deployment_deployments_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/with-cluster":{"post":{"tags":["deployments"],"summary":"Create Deployment With Cluster","description":"Create a new cluster and deployment in one transaction.","operationId":"create_deployment_with_cluster_deployments_with_cluster_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClusterAndDeploymentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/app-hosting":{"post":{"tags":["deployments"],"summary":"Create App Hosting Deployment","description":"Create a deployment on App Hosting infrastructure.\n\nEach App Hosting deployment gets its own vCluster running on the shared\nhost cluster infrastructure. This provides isolated Kubernetes environments\nwith minimal resource overhead.\n\nThis will:\n1. Pick the best available location for the geographic region\n2. Create a vCluster (tier=SHARED) for this deployment\n3. Trigger app-hosting job to provision vCluster + deploy the app","operationId":"create_app_hosting_deployment_deployments_app_hosting_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppHostingDeploymentCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/{deployment_id}":{"get":{"tags":["deployments"],"summary":"Get Deployment","operationId":"get_deployment_deployments__deployment_id__get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["deployments"],"summary":"Update Deployment","description":"Update a deployment's configuration.\n\nChanges will regenerate the values.yaml and queue a worker job to sync to Git,\ntriggering ArgoCD to redeploy with the new configuration.\n\nService principal (X-Service-Token) may update any deployment — internal\ntooling uses this same public endpoint per the dogfood principle (e.g.\nops migrations of env secret_refs).","operationId":"update_deployment_deployments__deployment_id__patch","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["deployments"],"summary":"Delete Deployment","operationId":"delete_deployment_deployments__deployment_id__delete","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/{deployment_id}/live-status":{"get":{"tags":["deployments"],"summary":"Get Live Deployment Status","description":"Get real-time ArgoCD status for a deployment.\n\nThis endpoint queries ArgoCD directly for the current application status,\nwhich is more up-to-date than the database status. If the ArgoCD status\ndiffers from the database, it will update the database accordingly.\n\nUse cases:\n- Checking status during PROVISIONING without waiting for hourly sync\n- Getting immediate feedback after deployment changes\n- Debugging deployment issues with real ArgoCD status\n\nReturns:\n    LiveStatusResponse with both DB status and live ArgoCD status","operationId":"get_live_deployment_status_deployments__deployment_id__live_status_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiveStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/{deployment_id}/values":{"get":{"tags":["deployments"],"summary":"Get Deployment Values","description":"Get the generated values.yaml for a deployment.","operationId":"get_deployment_values_deployments__deployment_id__values_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentValuesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/{deployment_id}/values.yaml":{"get":{"tags":["deployments"],"summary":"Download Deployment Values","description":"Download the values.yaml file directly.","operationId":"download_deployment_values_deployments__deployment_id__values_yaml_get","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/{deployment_id}/promote":{"post":{"tags":["deployments"],"summary":"Promote Deployment","description":"Promote/migrate a deployment to another cluster.\n\nThis copies the deployment configuration to a new cluster without\nmigrating any state or persistent data. The new deployment will\nstart fresh on the target cluster.\n\nThe promotion is performed asynchronously by the worker. The new\ndeployment is created with PROMOTING status and will transition\nto RUNNING when complete.\n\nUse cases:\n- Shared vCluster → Dedicated cluster (scaling up)\n- Dedicated cluster → Dedicated cluster (region/provider change)\n- Dedicated cluster → Shared vCluster (scaling down for cost savings)","operationId":"promote_deployment_deployments__deployment_id__promote_post","parameters":[{"name":"deployment_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Deployment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentPromotionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentPromotionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/deployments/import":{"post":{"tags":["deployments"],"summary":"Import Workloads","description":"Import discovered workloads as Mengi deployments.\n\nCreates Deployment records and pushes values to Git with autoSync=false,\nso ArgoCD creates Applications but does not sync them automatically.\nUsers may only import into imported clusters; the service principal\n(worker) may import into any cluster — used after a namespace migration\nto adopt the restored workloads. Service-created deployments are owned\nby the cluster owner.","operationId":"import_workloads_deployments_import_post","parameters":[{"name":"cluster_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Cluster ID to import workloads into","title":"Cluster Id"},"description":"Cluster ID to import workloads into"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkloadImportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/subscription":{"get":{"tags":["billing"],"summary":"Get Subscription","operationId":"get_subscription_billing_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionResponse"}}}}}}},"/billing/billing-mode":{"patch":{"tags":["billing"],"summary":"Update Billing Mode","description":"Switch between threshold and monthly billing modes.\n\nNew accounts start on threshold billing (collected every €50).  After\n30 days from mandate verification the account may switch to monthly\nbilling (collected once per month).  Switching back to threshold is\nalways allowed.","operationId":"update_billing_mode_billing_billing_mode_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingModeUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/status":{"get":{"tags":["billing"],"summary":"Get Billing Status","description":"Get current billing status including mandate verification, credit limit, and usage.\n\nWith ``organization_id`` this returns the organization's billing status\n(requires membership); otherwise the user's personal one.","operationId":"get_billing_status_billing_status_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/setup-mandate":{"post":{"tags":["billing"],"summary":"Setup Mandate","description":"Create a verification payment (1 EUR) to set up or update mandate.\nThis verifies the payment method and establishes a mandate for recurring charges.\nCan also be used to update an existing payment method.","operationId":"setup_mandate_billing_setup_mandate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/org/{slug}/setup-mandate":{"post":{"tags":["billing"],"summary":"Setup Org Mandate","description":"Set up (or update) the organization's payment mandate. Resources owned by\nthe organization bill this subscription. Requires ADMIN or OWNER.","operationId":"setup_org_mandate_billing_org__slug__setup_mandate_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandateSetupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/verify-mandate":{"post":{"tags":["billing"],"summary":"Verify Mandate","description":"Verify mandate status by checking pending payments with Mollie.\nCalled when user returns from payment to handle cases where webhook didn't fire.\nWith ``organization_id`` this verifies the organization's mandate (admin+).","operationId":"verify_mandate_billing_verify_mandate_post","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/portal":{"post":{"tags":["billing"],"summary":"Create Portal Session","description":"Redirect to manage subscription.\nMollie doesn't have a built-in portal like Stripe, so we handle this in our own UI.\nFor now, return our billing management page.","operationId":"create_portal_session_billing_portal_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalSessionResponse"}}}}}}},"/billing/cancel":{"post":{"tags":["billing"],"summary":"Cancel Subscription","description":"Cancel the current subscription.","operationId":"cancel_subscription_billing_cancel_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/webhook":{"post":{"tags":["billing"],"summary":"Mollie Webhook","description":"Handle Mollie webhooks for payment and subscription updates.\nMollie sends POST with form data containing 'id' of the payment/subscription.\n\nReturns 200 on success, 500 on failure to allow Mollie to retry.\nHandlers must be idempotent to safely handle retries.","operationId":"mollie_webhook_billing_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/billing/transactions":{"get":{"tags":["billing"],"summary":"Get Billing Transactions","description":"Get billing transaction history for the active scope: the organization's\nwith ``organization_id`` (requires membership), otherwise the user's own.","operationId":"get_billing_transactions_billing_transactions_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingTransactionsListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/invoices/{invoice_id}/download":{"get":{"tags":["billing"],"summary":"Download Invoice","description":"Download the MoneyBird invoice PDF.\n\nThe PDF is fetched through the MoneyBird API and streamed to the user.\nThe invoice's public MoneyBird URL is deliberately not used: it requires a\nper-invoice access code that MoneyBird only emails to the billing contact,\nwhich other org members don't have.","operationId":"download_invoice_billing_invoices__invoice_id__download_get","parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","title":"Invoice Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/payment-methods":{"get":{"tags":["billing"],"summary":"Get Payment Methods","description":"Get the active payment method (mandate) from Mollie for the active\nscope: the organization's with ``organization_id``, otherwise the user's.","operationId":"get_payment_methods_billing_payment_methods_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/billing/payment-method":{"delete":{"tags":["billing"],"summary":"Remove Payment Method","description":"Remove the payment method (revoke all mandates) for the active scope:\nthe organization's with ``organization_id`` (admin+), otherwise the user's.\nOnly allowed when there are no active deployments or clusters in the scope.","operationId":"remove_payment_method_billing_payment_method_delete","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/providers/products/pricing":{"get":{"tags":["providers"],"summary":"Get Product Pricing","description":"Get the public \"from\" price per cluster product for the landing page.\n\nThe \"from\" price is the platform fee plus the cheapest infrastructure\nbaseline we have pricing for. We use Hetzner as the baseline because\nit's typically the lowest-cost provider in our supported list. The\nactual infrastructure cost a customer pays depends on which provider\nthey pick and is billed separately at the provider's actual rate.\n\nFor the Development (shared) tier there is no infrastructure\npass-through - the host is paid for by Mengi - so the from-price\nequals the platform fee.\n\nProduct mapping:\n- shared       -> Development tier\n- dedicated    -> Dedicated tier\n- dedicatedHa  -> Dedicated HA tier","operationId":"get_product_pricing_providers_products_pricing_get","parameters":[{"name":"currency","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SupportedCurrency","description":"Currency for pricing (EUR or USD)","default":"EUR"},"description":"Currency for pricing (EUR or USD)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/providers":{"get":{"tags":["providers"],"summary":"List Providers","description":"List all supported cloud providers with real-time cluster pricing.\nAll providers use self-managed Kubernetes for consistent, provider-agnostic deployments.","operationId":"list_providers_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/providers/pricing":{"get":{"tags":["providers"],"summary":"Get All Pricing","description":"Get detailed cluster pricing for all supported providers.\nReturns control plane costs, node costs, and total monthly estimates.","operationId":"get_all_pricing_providers_pricing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/providers/{provider}/regions":{"get":{"tags":["providers"],"summary":"Get Provider Regions","description":"Get available regions for a cloud provider.\nFor Hetzner, optionally check real-time availability with check_availability=true.\nRegions disabled by admins are shown but marked as unavailable with a reason.","operationId":"get_provider_regions_providers__provider__regions_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"check_availability","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Check Availability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/providers/{provider}/server-types":{"get":{"tags":["providers"],"summary":"Get Provider Server Types","description":"Machine types a cluster's worker nodes can be switched to.\n\nLive from the provider where the platform can query it (Hetzner,\nScaleway, DigitalOcean), otherwise from a maintained catalog. Prices\nare indicative monthly EUR per node.","operationId":"get_provider_server_types_providers__provider__server_types_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Provider region; filters to types offered there","title":"Region"},"description":"Provider region; filters to types offered there"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/providers/{provider}/pricing":{"get":{"tags":["providers"],"summary":"Get Single Provider Pricing","description":"Get detailed cluster pricing for a specific provider.\nOptionally specify a tier for tiered pricing (e.g., testing vs production for Hetzner).","operationId":"get_single_provider_pricing_providers__provider__pricing_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Cluster tier: testing or production","title":"Tier"},"description":"Cluster tier: testing or production"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/providers/{provider}/pricing/tiers":{"get":{"tags":["providers"],"summary":"Get Provider Pricing Tiers","description":"Get pricing for all available tiers for a specific provider.\nReturns a list of pricing options (e.g., testing and production for Hetzner).","operationId":"get_provider_pricing_tiers_providers__provider__pricing_tiers_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/providers/{provider}/storage-pricing":{"get":{"tags":["providers"],"summary":"Get Storage Pricing","description":"Get current block storage pricing for a provider (dynamically fetched).\n\nPrices are cached for 1 hour and fetched from cloud provider APIs.\nReturns the price per GB per month in EUR.","operationId":"get_storage_pricing_providers__provider__storage_pricing_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional region for region-specific pricing","title":"Region"},"description":"Optional region for region-specific pricing"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/analysis/docker-image":{"post":{"tags":["analysis"],"summary":"Analyze Docker Image Endpoint","description":"Analyze a Docker image reference to extract:\n- Image information\n- Suggested ports and volumes\n- Required environment variables\n- Backing services (databases, caches, etc.)\n- 12-factor app compliance analysis\n- Deployment recommendations","operationId":"analyze_docker_image_endpoint_analysis_docker_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerImageAnalysisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DockerImageAnalysisResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/usage/current":{"get":{"tags":["usage"],"summary":"Get Current Usage","description":"Get current usage and cost estimate for the authenticated user.","operationId":"get_current_usage_usage_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentUsageResponse"}}}}}}},"/usage/summary":{"get":{"tags":["usage"],"summary":"Get Usage Summary","description":"Get usage summary for the specified period.","operationId":"get_usage_summary_usage_summary_get","parameters":[{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Period Days"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deployment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/usage/history":{"get":{"tags":["usage"],"summary":"Get Usage History","description":"Get detailed usage history records.","operationId":"get_usage_history_usage_history_get","parameters":[{"name":"period_days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Period Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"List all API keys for the current user.","operationId":"list_api_keys_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyListResponse"}}}}}},"post":{"tags":["api-keys"],"summary":"Create Api Key","description":"Create a new API key.\n\nThe full API key is only returned once in this response.\nStore it securely - you won't be able to see it again.","operationId":"create_api_key_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api-keys/{key_id}":{"get":{"tags":["api-keys"],"summary":"Get Api Key","description":"Get details of a specific API key.","operationId":"get_api_key_api_keys__key_id__get","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["api-keys"],"summary":"Revoke Api Key","description":"Revoke (deactivate) an API key.\n\nThe key will no longer be usable for authentication.\nThis action cannot be undone.","operationId":"revoke_api_key_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["api-keys"],"summary":"Update Api Key","description":"Update an API key's name or description.","operationId":"update_api_key_api_keys__key_id__patch","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/connected-applications":{"get":{"tags":["connected-applications"],"summary":"List Connected Applications","description":"List applications you have authorized to access your account.","operationId":"list_connected_applications_connected_applications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAppListResponse"}}}}}}},"/connected-applications/{client_id}":{"delete":{"tags":["connected-applications"],"summary":"Revoke Connected Application","description":"Revoke an application's access. Takes effect immediately.","operationId":"revoke_connected_application_connected_applications__client_id__delete","parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/secrets":{"post":{"tags":["secrets"],"summary":"Create Secret","description":"Create a new secret.\n\nThe secret is stored in OpenBao - nothing is stored in our database.","operationId":"create_secret_secrets_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["secrets"],"summary":"List Secrets","description":"List secrets in the active organization's namespace (defaults to the user's\npersonal org). If deployment_id is provided, the deployment's org namespace\nis listed and the result contains the secrets that deployment can consume:\nits own deployment-scoped secrets plus the org-wide (unscoped) ones. Other\ndeployments' scoped secrets are excluded.","operationId":"list_secrets_secrets_get","parameters":[{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deployment Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/secrets/{secret_name}/value":{"get":{"tags":["secrets"],"summary":"Get Secret Value","description":"Get a secret's value from OpenBao.\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"get_secret_value_secrets__secret_name__value_get","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretValueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/secrets/{secret_name}":{"get":{"tags":["secrets"],"summary":"Get Secret","description":"Get details of a specific secret by name (value is never returned).\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"get_secret_secrets__secret_name__get","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["secrets"],"summary":"Delete Secret","description":"Delete a secret from OpenBao.\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"delete_secret_secrets__secret_name__delete","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["secrets"],"summary":"Update Secret","description":"Update a secret's value in OpenBao.\n\nUse deployment_id query param if the secret is deployment-scoped.","operationId":"update_secret_secrets__secret_name__put","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"database_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/secrets/{secret_name}/transfer":{"post":{"tags":["secrets"],"summary":"Transfer Secret","description":"Move a secret from the active org's namespace to another org's namespace.\n\n`organization_id` (or the deployment's org) is the source; the caller must be\na member of both source and target orgs. The OpenBao value is copied to the\ntarget namespace and deleted from the source.","operationId":"transfer_secret_secrets__secret_name__transfer_post","parameters":[{"name":"secret_name","in":"path","required":true,"schema":{"type":"string","title":"Secret Name"}},{"name":"deployment_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretTransferRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations":{"get":{"tags":["organizations"],"summary":"List Organizations","description":"List all organizations the current user is a member of.","operationId":"list_organizations_organizations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationListResponse"}}}}}},"post":{"tags":["organizations"],"summary":"Create Organization","description":"Create a new organization.","operationId":"create_organization_organizations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}":{"get":{"tags":["organizations"],"summary":"Get Organization","description":"Get organization details by slug.","operationId":"get_organization_organizations__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["organizations"],"summary":"Update Organization","description":"Update organization details.","operationId":"update_organization_organizations__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Delete Organization","description":"Delete an organization (owner only).\n\nRefuses while the organization still owns clusters, deployments, databases\nor secrets, and while it has an unpaid balance or a payment being collected\n(platform admins can pass ?force=true to write the balance off). Its cloud\nand DNS credentials are deleted with it, secrets included.","operationId":"delete_organization_organizations__slug__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"force","in":"query","required":false,"schema":{"type":"boolean","description":"Platform admins only: delete despite a billing hold (the unpaid balance is written off)","default":false,"title":"Force"},"description":"Platform admins only: delete despite a billing hold (the unpaid balance is written off)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}/members":{"post":{"tags":["organizations"],"summary":"Add Member","description":"Add a member to the organization.","operationId":"add_member_organizations__slug__members_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}/invite":{"post":{"tags":["organizations"],"summary":"Invite Member","description":"Invite a member to the organization by email.","operationId":"invite_member_organizations__slug__invite_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberInvite"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}/members/{user_id}":{"patch":{"tags":["organizations"],"summary":"Update Member","description":"Update a member's role.","operationId":"update_member_organizations__slug__members__user_id__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationMemberResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["organizations"],"summary":"Remove Member","description":"Remove a member from the organization.","operationId":"remove_member_organizations__slug__members__user_id__delete","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}/transfer-trial-credit":{"post":{"tags":["organizations"],"summary":"Transfer Trial Credit","description":"Move the caller's remaining personal trial credit to this organization.\n\nCampaign (QR) trial credit lands on the personal account; this lets an\nADMIN/OWNER of a team organization bring it along. Refused (409) when the\norganization already has trial credit or a payment method, or when the\npersonal workspace still owns billable resources.","operationId":"transfer_trial_credit_organizations__slug__transfer_trial_credit_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{slug}/transfer-resource":{"post":{"tags":["organizations"],"summary":"Transfer Resource","description":"Transfer a resource to this organization.\n\nThe caller must be an ADMIN/OWNER of both the resource's current organization\nand the target organization. Transferring a cluster cascades to everything it\nowns (deployments, databases, and their secrets) so the org-inheritance\ninvariant is preserved.","operationId":"transfer_resource_organizations__slug__transfer_resource_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResourceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/versions/kubernetes/{provider}":{"get":{"tags":["versions"],"summary":"Get Kubernetes Versions","description":"Get supported Kubernetes versions for a provider.\n\nFetches versions from cloud provider APIs with 1-hour caching.\nReturns a list of versions sorted by recommendation order (default first).","operationId":"get_kubernetes_versions_versions_kubernetes__provider__get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"cluster_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by cluster type: managed, rke2, k3k","title":"Cluster Type"},"description":"Filter by cluster type: managed, rke2, k3k"},{"name":"include_deprecated","in":"query","required":false,"schema":{"type":"boolean","description":"Include deprecated versions","default":false,"title":"Include Deprecated"},"description":"Include deprecated versions"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesVersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/versions/kubernetes/{provider}/default":{"get":{"tags":["versions"],"summary":"Get Default Kubernetes Version","description":"Get the default Kubernetes version for a provider.","operationId":"get_default_kubernetes_version_versions_kubernetes__provider__default_get","parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"cluster_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by cluster type","title":"Cluster Type"},"description":"Filter by cluster type"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/versions/kubernetes/k3k":{"get":{"tags":["versions"],"summary":"Get K3K Versions","description":"Get supported k3s versions for k3k cluster deployments.\n\nFetches versions from k3s GitHub releases with 1-hour caching.","operationId":"get_k3k_versions_versions_kubernetes_k3k_get","parameters":[{"name":"include_deprecated","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deprecated"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KubernetesVersionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/versions/bundles":{"get":{"tags":["versions"],"summary":"List Component Bundles","description":"Get available component bundles from GitLab tags.\n\nComponent bundles are git tags in the mengi-cluster-apps repository.\nThis endpoint queries GitLab API and caches results for 5 minutes.","operationId":"list_component_bundles_versions_bundles_get","parameters":[{"name":"stable_only","in":"query","required":false,"schema":{"type":"boolean","description":"Only return stable bundles","default":false,"title":"Stable Only"},"description":"Only return stable bundles"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/versions/bundles/stable":{"get":{"tags":["versions"],"summary":"Get Stable Bundle Endpoint","description":"Get the current stable component bundle.\n\nReturns the highest semver tag without prerelease suffix.","operationId":"get_stable_bundle_endpoint_versions_bundles_stable_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleResponse"}}}}}}},"/versions/bundles/{version}":{"get":{"tags":["versions"],"summary":"Get Component Bundle","description":"Get details for a specific component bundle version.","operationId":"get_component_bundle_versions_bundles__version__get","parameters":[{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComponentBundleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/versions/bundles-excluded":{"get":{"tags":["versions"],"summary":"Get Excluded Components Endpoint","description":"Get list of components excluded from user-facing bundle views.\n\nThese components are only deployed to management or host clusters,\ndetermined by parsing ApplicationSet selector labels from GitLab.\nResults are cached for 5 minutes.","operationId":"get_excluded_components_endpoint_versions_bundles_excluded_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExcludedComponentsResponse"}}}}}}},"/registry/credentials":{"get":{"tags":["registry"],"summary":"Get Registry Credentials","description":"Get the active organization's registry credentials.\n\nReturns credential metadata without the actual token password.","operationId":"get_registry_credentials_registry_credentials_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentialStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["registry"],"summary":"Create Registry Credentials","description":"Generate new registry credentials for the active organization.\n\nCreates a Harbor project and robot account. The robot secret is only\nreturned once - save it immediately!","operationId":"create_registry_credentials_registry_credentials_post","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentialCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["registry"],"summary":"Delete Registry Credentials","description":"Revoke and delete the organization's registry credentials.\n\nThis will:\n- Revoke the robot account in Harbor\n- Mark the credential as inactive","operationId":"delete_registry_credentials_registry_credentials_delete","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/registry/images":{"get":{"tags":["registry"],"summary":"List Registry Images","description":"List repositories (images and Helm charts) in the organization's Harbor\nregistry project. Each entry carries its artifact_type.\n\nReturns an empty list if the organization has no registry credentials.","operationId":"list_registry_images_registry_images_get","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegistryRepositoryResponse"},"title":"Response List Registry Images Registry Images Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/registry/images/{repository_name}/tags":{"get":{"tags":["registry"],"summary":"List Registry Image Tags","description":"List tags for a repository in the organization's Harbor registry project.\n\nReturns 404 if the organization has no registry credentials.","operationId":"list_registry_image_tags_registry_images__repository_name__tags_get","parameters":[{"name":"repository_name","in":"path","required":true,"schema":{"type":"string","title":"Repository Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RegistryTagResponse"},"title":"Response List Registry Image Tags Registry Images  Repository Name  Tags Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/registry/images/{repository_name}":{"delete":{"tags":["registry"],"summary":"Delete Registry Repository","description":"Delete an entire repository from the organization's Harbor registry project.","operationId":"delete_registry_repository_registry_images__repository_name__delete","parameters":[{"name":"repository_name","in":"path","required":true,"schema":{"type":"string","title":"Repository Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/registry/images/{repository_name}/tags/{tag_name}":{"delete":{"tags":["registry"],"summary":"Delete Registry Image Tag","description":"Delete a specific tag from a repository in the organization's Harbor registry project.","operationId":"delete_registry_image_tag_registry_images__repository_name__tags__tag_name__delete","parameters":[{"name":"repository_name","in":"path","required":true,"schema":{"type":"string","title":"Repository Name"}},{"name":"tag_name","in":"path","required":true,"schema":{"type":"string","title":"Tag Name"}},{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/registry/credentials/regenerate":{"post":{"tags":["registry"],"summary":"Regenerate Registry Credentials","description":"Regenerate the organization's registry credentials.\n\nThis will revoke the existing robot account and create a new one.\nThe new robot secret is only returned once - save it immediately!","operationId":"regenerate_registry_credentials_registry_credentials_regenerate_post","parameters":[{"name":"organization_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegistryCredentialCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{org_slug}/invoice-settings":{"get":{"tags":["invoice-settings"],"summary":"Get Invoice Settings","description":"Get invoice settings for an organization.","operationId":"get_invoice_settings_organizations__org_slug__invoice_settings_get","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["invoice-settings"],"summary":"Create Invoice Settings","description":"Create invoice settings for an organization.","operationId":"create_invoice_settings_organizations__org_slug__invoice_settings_post","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["invoice-settings"],"summary":"Update Invoice Settings","description":"Update invoice settings for an organization.","operationId":"update_invoice_settings_organizations__org_slug__invoice_settings_patch","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["invoice-settings"],"summary":"Delete Invoice Settings","description":"Delete invoice settings for an organization.","operationId":"delete_invoice_settings_organizations__org_slug__invoice_settings_delete","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{org_slug}/invoice-settings/validate-vat":{"post":{"tags":["invoice-settings"],"summary":"Validate Vat Number","description":"Validate a VAT number without saving it.","operationId":"validate_vat_number_organizations__org_slug__invoice_settings_validate_vat_post","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATValidationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VATValidationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/organizations/{org_slug}/invoice-settings/reverify-vat":{"post":{"tags":["invoice-settings"],"summary":"Reverify Vat Number","description":"Re-verify the stored VAT number with VIES.","operationId":"reverify_vat_number_organizations__org_slug__invoice_settings_reverify_vat_post","parameters":[{"name":"org_slug","in":"path","required":true,"schema":{"type":"string","title":"Org Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceSettingsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/countries":{"get":{"tags":["countries"],"summary":"List Countries","description":"Get list of countries for dropdown.","operationId":"list_countries_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryListResponse"}}}}}}},"/contact":{"post":{"tags":["contact"],"summary":"Send Contact Message","description":"Send a contact message to the Mengi Cloud team.\n\nThis endpoint is public and does not require authentication.","operationId":"send_contact_message_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invitations/{token}":{"get":{"tags":["invitations"],"summary":"Get Invitation Preview","description":"Public preview of an invitation, shown before signup/login.\n\nUnknown and revoked tokens both return 404 so outsiders can't probe\nwhich tokens ever existed.","operationId":"get_invitation_preview_invitations__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/invitations/{token}/accept":{"post":{"tags":["invitations"],"summary":"Accept","description":"Accept an invitation as the signed-in user.\n\nThe signed-in email must match the invited address (case-insensitive).\nCreates the organization (with its trial subscription, if any) for\nnew-org invitations.","operationId":"accept_invitations__token__accept_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationAcceptResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/{code}":{"get":{"tags":["campaigns"],"summary":"Get Campaign Preview","description":"Public preview of a campaign, shown on the QR landing page.\n\nUnknown and revoked codes both return 404.","operationId":"get_campaign_preview_campaigns__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignPreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/campaigns/{code}/redeem":{"post":{"tags":["campaigns"],"summary":"Redeem","description":"Redeem the campaign's trial credit onto the signed-in user's\npersonal account. One trial per user, ever.","operationId":"redeem_campaigns__code__redeem_post","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignRedeemResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases":{"post":{"tags":["databases"],"summary":"Create Database","description":"Create a new managed database instance.","operationId":"create_database_databases_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"List Databases","description":"List managed database instances accessible to the user (owned or via org).","operationId":"list_databases_databases_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"cluster_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cluster Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}":{"get":{"tags":["databases"],"summary":"Get Database","description":"Get details of a specific managed database instance.","operationId":"get_database_databases__database_id__get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["databases"],"summary":"Update Database","description":"Update configuration of a managed database instance.","operationId":"update_database_databases__database_id__patch","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["databases"],"summary":"Delete Database","description":"Delete a managed database instance. If it belongs to a replication group, all members are deleted.","operationId":"delete_database_databases__database_id__delete","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/backups":{"post":{"tags":["databases"],"summary":"Create Backup","description":"Trigger a manual backup of a database instance.","operationId":"create_backup_databases__database_id__backups_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BackupCreateRequest","default":{"backup_type":"manual"}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseBackupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"Get Backups","description":"List backups for a database instance.\n\nThe operator takes scheduled backups on the cluster by itself; the\nworker mirrors them into this list. Opening the list asks for a fresh\nmirror so a new scheduled backup shows up on the next refresh instead of\nat the next periodic sweep.","operationId":"get_backups_databases__database_id__backups_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseBackupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/restore":{"post":{"tags":["databases"],"summary":"Restore Database","description":"Overwrite the database's current data with one of its backups, in place.\n\n`backup_id` is a backup from GET /databases/{id}/backups that has\ncompleted. The database keeps its name, host, user and password, so\nconnected applications only need to reconnect. Works for PostgreSQL and\nMySQL databases that are not part of a replication group.\n\nThe restore runs in the background and the database shows the status\n`restoring` meanwhile; it is unavailable for most of that time. It\nfirst takes a safety backup of the current data (type `pre_restore`);\nif that backup fails, nothing is overwritten and the database returns to\n`running` with the reason in `error_message`. On success the database\nreturns to `running`; if the restore fails after the data was touched,\nit goes to `error`.\n\nResponds 202 with the database (status `restoring`), 400 when the backup\ncannot be restored in place, 404 when the database or backup is not\nfound, and 409 when the database is not running or already restoring.","operationId":"restore_database_databases__database_id__restore_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RestoreRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/credentials":{"get":{"tags":["databases"],"summary":"Get Credentials","description":"Get connection credentials for a database instance.","operationId":"get_credentials_databases__database_id__credentials_get","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseCredentialsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/replication-groups":{"post":{"tags":["databases"],"summary":"Create Replication","description":"Create a replication group spanning multiple clusters.\n\nThe first cluster becomes the primary (read-write). Remaining clusters\nbecome replicas that are provisioned after the primary is running.","operationId":"create_replication_databases_replication_groups_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationGroupCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationGroupResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["databases"],"summary":"List Replication","description":"List replication groups accessible to the user (owned or via org).","operationId":"list_replication_databases_replication_groups_get","parameters":[{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplicationGroupListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/replication-groups/{group_id}":{"delete":{"tags":["databases"],"summary":"Delete Replication","description":"Delete a replication group and all its database instances.","operationId":"delete_replication_databases_replication_groups__group_id__delete","parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/databases/{database_id}/promote":{"post":{"tags":["databases"],"summary":"Promote Database","description":"Promote a replica to primary within its replication group.","operationId":"promote_database_databases__database_id__promote_post","parameters":[{"name":"database_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Database Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatabaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api":{"get":{"summary":"Api Info","description":"API information and available versions.","operationId":"api_info_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"APIKeyCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["name"],"title":"APIKeyCreate"},"APIKeyCreateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"key":{"type":"string","title":"Key"},"key_prefix":{"type":"string","title":"Key Prefix"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","description","key","key_prefix","expires_at","created_at"],"title":"APIKeyCreateResponse","description":"Response when creating a new API key - includes the full key (only shown once)."},"APIKeyListResponse":{"properties":{"keys":{"items":{"$ref":"#/components/schemas/APIKeyResponse"},"type":"array","title":"Keys"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["keys","total"],"title":"APIKeyListResponse"},"APIKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"key_prefix":{"type":"string","title":"Key Prefix"},"scopes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scopes"},"is_active":{"type":"boolean","title":"Is Active"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"last_used_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used Ip"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"}},"type":"object","required":["id","name","description","key_prefix","scopes","is_active","last_used_at","last_used_ip","expires_at","created_at","revoked_at"],"title":"APIKeyResponse"},"AdditionalPort":{"properties":{"port":{"type":"integer","maximum":65535.0,"minimum":1.0,"title":"Port"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"protocol":{"anyOf":[{"type":"string","enum":["TCP","UDP"]},{"type":"null"}],"title":"Protocol"}},"type":"object","required":["port"],"title":"AdditionalPort","description":"An extra container port, exposed on the pod and the deployment's\nin-cluster Service (the ingress keeps routing to the main container port).\n\n`name` must be a valid Kubernetes port name (lowercase alphanumerics and\n'-', at most 15 chars, at least one letter); it defaults to port-<port>.\nAn unset `protocol` means TCP."},"AdminArticleAuthor":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["id"],"title":"AdminArticleAuthor"},"AdminArticleListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminArticleResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"AdminArticleListResponse"},"AdminArticleResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"category":{"type":"string","title":"Category"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"body":{"type":"string","title":"Body"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"is_published":{"type":"boolean","title":"Is Published"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"author":{"anyOf":[{"$ref":"#/components/schemas/AdminArticleAuthor"},{"type":"null"}]}},"type":"object","required":["id","category","slug","title","body","is_published","created_at","updated_at"],"title":"AdminArticleResponse"},"AdminCampaignCreate":{"properties":{"name":{"type":"string","title":"Name"},"trial_credit_eur":{"type":"number","title":"Trial Credit Eur","default":50},"max_redemptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions"},"expires_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires Days"}},"type":"object","required":["name"],"title":"AdminCampaignCreate"},"AdminCampaignResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"code":{"type":"string","title":"Code"},"join_url":{"type":"string","title":"Join Url"},"trial_credit_eur":{"type":"number","title":"Trial Credit Eur"},"max_redemptions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Redemptions"},"redemption_count":{"type":"integer","title":"Redemption Count"},"status":{"type":"string","title":"Status"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","name","code","join_url","trial_credit_eur","max_redemptions","redemption_count","status","expires_at","created_at"],"title":"AdminCampaignResponse"},"AdminInvitationCreate":{"properties":{"email":{"type":"string","title":"Email"},"invitee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitee Name"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"role":{"$ref":"#/components/schemas/OrganizationRole","default":"owner"},"trial_credit_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trial Credit Eur"},"expires_days":{"type":"integer","title":"Expires Days","default":14}},"type":"object","required":["email"],"title":"AdminInvitationCreate"},"AdminInvitationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"invitee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitee Name"},"role":{"type":"string","title":"Role"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"organization_created":{"type":"boolean","title":"Organization Created","default":false},"trial_credit_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trial Credit Eur"},"status":{"type":"string","title":"Status"},"invited_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invited By"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"accepted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Accepted At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"invite_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invite Url"}},"type":"object","required":["id","email","invitee_name","role","organization_id","organization_name","trial_credit_eur","status","invited_by","expires_at","accepted_at","created_at"],"title":"AdminInvitationResponse"},"AdminOrganizationMemberResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"role":{"$ref":"#/components/schemas/OrganizationRole"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","email","role","created_at"],"title":"AdminOrganizationMemberResponse"},"AdminOrganizationMembersAdd":{"properties":{"user_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"User Ids","default":[]},"emails":{"items":{"type":"string"},"type":"array","title":"Emails","default":[]},"role":{"$ref":"#/components/schemas/OrganizationRole","default":"member"},"notify":{"type":"boolean","title":"Notify","default":true}},"type":"object","title":"AdminOrganizationMembersAdd","description":"Users to add, by id and/or by email. Unknown emails are reported, not created."},"AdminOrganizationMembersAddResponse":{"properties":{"added":{"items":{"$ref":"#/components/schemas/AdminOrganizationMemberResponse"},"type":"array","title":"Added"},"already_members":{"items":{"type":"string"},"type":"array","title":"Already Members"},"not_found":{"items":{"type":"string"},"type":"array","title":"Not Found"}},"type":"object","required":["added","already_members","not_found"],"title":"AdminOrganizationMembersAddResponse"},"AdminStatsResponse":{"properties":{"total_users":{"type":"integer","title":"Total Users"},"total_clusters":{"type":"integer","title":"Total Clusters"},"total_deployments":{"type":"integer","title":"Total Deployments"},"total_organizations":{"type":"integer","title":"Total Organizations"},"running_clusters":{"type":"integer","title":"Running Clusters"},"running_deployments":{"type":"integer","title":"Running Deployments"},"total_revenue":{"type":"number","title":"Total Revenue"}},"type":"object","required":["total_users","total_clusters","total_deployments","total_organizations","running_clusters","running_deployments","total_revenue"],"title":"AdminStatsResponse"},"AdminTrialCreditRequest":{"properties":{"amount_eur":{"type":"number","title":"Amount Eur","default":50.0}},"type":"object","title":"AdminTrialCreditRequest"},"AdminTrialCreditResponse":{"properties":{"organization_id":{"type":"string","title":"Organization Id"},"granted":{"type":"boolean","title":"Granted"},"subscription_status":{"type":"string","title":"Subscription Status"},"trial_credit_total":{"type":"number","title":"Trial Credit Total"},"trial_credit_remaining":{"type":"number","title":"Trial Credit Remaining"}},"type":"object","required":["organization_id","granted","subscription_status","trial_credit_total","trial_credit_remaining"],"title":"AdminTrialCreditResponse"},"AdoptedDeploymentEnvironmentUpdate":{"properties":{"environment_variables":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Environment Variables"}},"type":"object","required":["environment_variables"],"title":"AdoptedDeploymentEnvironmentUpdate"},"AlertListResponse":{"properties":{"alerts":{"items":{"$ref":"#/components/schemas/AlertResponse"},"type":"array","title":"Alerts"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["alerts","total"],"title":"AlertListResponse"},"AlertResponse":{"properties":{"fingerprint":{"type":"string","title":"Fingerprint"},"status":{"type":"string","title":"Status"},"labels":{"additionalProperties":true,"type":"object","title":"Labels"},"annotations":{"additionalProperties":true,"type":"object","title":"Annotations"},"starts_at":{"type":"string","title":"Starts At"},"ends_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ends At"},"generator_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Generator Url"}},"type":"object","required":["fingerprint","status","labels","annotations","starts_at"],"title":"AlertResponse"},"AlertRuleCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"expression":{"type":"string","minLength":1,"title":"Expression"},"duration":{"type":"string","pattern":"^\\d+[smh]$","title":"Duration"},"severity":{"$ref":"#/components/schemas/AlertSeverity"},"labels":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Labels"},"annotations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Annotations"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":true},"notification_channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Notification Channel Ids"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}},"type":"object","required":["name","expression","duration","severity"],"title":"AlertRuleCreate"},"AlertRuleListResponse":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/AlertRuleResponse"},"type":"array","title":"Rules"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["rules","total"],"title":"AlertRuleListResponse"},"AlertRuleResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"cluster_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cluster Id"},"name":{"type":"string","title":"Name"},"expression":{"type":"string","title":"Expression"},"duration":{"type":"string","title":"Duration"},"severity":{"$ref":"#/components/schemas/AlertSeverity"},"labels":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Labels"},"annotations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Annotations"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"notification_channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Notification Channel Ids"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","name","expression","duration","severity","is_enabled","created_at","updated_at"],"title":"AlertRuleResponse"},"AlertRuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"expression":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Expression"},"duration":{"anyOf":[{"type":"string","pattern":"^\\d+[smh]$"},{"type":"null"}],"title":"Duration"},"severity":{"anyOf":[{"$ref":"#/components/schemas/AlertSeverity"},{"type":"null"}]},"labels":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Labels"},"annotations":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Annotations"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"},"notification_channel_ids":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Notification Channel Ids"}},"type":"object","title":"AlertRuleUpdate"},"AlertSeverity":{"type":"string","enum":["critical","warning","info"],"title":"AlertSeverity"},"AlertmanagerAlert":{"properties":{"status":{"type":"string","title":"Status","default":"firing"},"labels":{"additionalProperties":true,"type":"object","title":"Labels","default":{}},"annotations":{"additionalProperties":true,"type":"object","title":"Annotations","default":{}},"startsAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Startsat"},"endsAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endsat"},"fingerprint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fingerprint"}},"type":"object","title":"AlertmanagerAlert"},"AlertmanagerWebhook":{"properties":{"receiver":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receiver"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"alerts":{"items":{"$ref":"#/components/schemas/AlertmanagerAlert"},"type":"array","title":"Alerts","default":[]}},"type":"object","title":"AlertmanagerWebhook","description":"The Alertmanager webhook_configs payload (fields we use)."},"AppHostingDeploymentCreate":{"properties":{"geographic_region":{"type":"string","title":"Geographic Region"},"deployment_name":{"type":"string","title":"Deployment Name"},"app_type":{"type":"string","title":"App Type","default":"helm"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request","default":0.5},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb","default":512},"replicas":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replicas","default":1},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port","default":8080},"environment_variables":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Environment Variables"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"storage_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Size Gb"},"volumes":{"anyOf":[{"items":{"$ref":"#/components/schemas/VolumeConfig"},"type":"array"},{"type":"null"}],"title":"Volumes"},"run_as_uid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run As Uid"},"deployment_type":{"type":"string","title":"Deployment Type","default":"docker"},"helm_repo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Repo Url"},"helm_chart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Name"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"image_update_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Strategy"},"image_update_constraint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Constraint"},"image_allow_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Allow Tags"},"image_ignore_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Ignore Tags"},"kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubernetes Version"}},"type":"object","required":["geographic_region","deployment_name"],"title":"AppHostingDeploymentCreate","description":"Request for creating an App Hosting deployment on shared infrastructure."},"AppType":{"type":"string","enum":["web_app","api","database","static_site","container","helm"],"title":"AppType"},"ArticleAuthor":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["id"],"title":"ArticleAuthor"},"ArticleCategory":{"type":"string","enum":["blog","changelog"],"title":"ArticleCategory"},"ArticleCreate":{"properties":{"category":{"$ref":"#/components/schemas/ArticleCategory","default":"blog"},"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title"},"body":{"type":"string","minLength":1,"title":"Body"},"summary":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Summary"},"slug":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Slug"},"cover_image_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image Url"},"is_published":{"type":"boolean","title":"Is Published","default":false},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"}},"type":"object","required":["title","body"],"title":"ArticleCreate"},"ArticleDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"category":{"type":"string","title":"Category"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"author":{"anyOf":[{"$ref":"#/components/schemas/ArticleAuthor"},{"type":"null"}]},"body":{"type":"string","title":"Body"}},"type":"object","required":["id","category","slug","title","body"],"title":"ArticleDetail"},"ArticleListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ArticleSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"ArticleListResponse"},"ArticleSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"category":{"type":"string","title":"Category"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"author":{"anyOf":[{"$ref":"#/components/schemas/ArticleAuthor"},{"type":"null"}]}},"type":"object","required":["id","category","slug","title"],"title":"ArticleSummary"},"ArticleUpdate":{"properties":{"category":{"anyOf":[{"$ref":"#/components/schemas/ArticleCategory"},{"type":"null"}]},"title":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Title"},"body":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Body"},"summary":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Summary"},"slug":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Slug"},"cover_image_url":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Cover Image Url"},"is_published":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Published"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"}},"type":"object","title":"ArticleUpdate"},"AssistantChatRequest":{"properties":{"messages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Messages"},"signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signature"},"prompt":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Prompt"},"decision":{"anyOf":[{"$ref":"#/components/schemas/AssistantDecision"},{"type":"null"}]},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}},"type":"object","title":"AssistantChatRequest","description":"One turn. Either a new prompt or a decision on a pending action."},"AssistantDecision":{"properties":{"tool_use_id":{"type":"string","title":"Tool Use Id"},"approved":{"type":"boolean","title":"Approved"}},"type":"object","required":["tool_use_id","approved"],"title":"AssistantDecision"},"AssistantPromptLogEntry":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"kind":{"type":"string","title":"Kind"},"content":{"type":"string","title":"Content"},"approved":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Approved"},"response":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response"},"tool_calls":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Tool Calls"},"stop_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stop Reason"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"api_calls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Api Calls"},"input_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Tokens"},"cache_read_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cache Read Tokens"},"cache_write_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cache Write Tokens"},"output_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Tokens"},"cost_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Usd"}},"type":"object","required":["id","created_at","user_id","user_email","organization_id","kind","content","approved"],"title":"AssistantPromptLogEntry"},"AssistantPromptLogList":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/AssistantPromptLogEntry"},"type":"array","title":"Entries"},"total":{"type":"integer","title":"Total"},"total_cost_usd":{"type":"number","title":"Total Cost Usd","default":0.0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0}},"type":"object","required":["entries","total"],"title":"AssistantPromptLogList"},"AutoscalerServerTypePin":{"properties":{"server_type":{"anyOf":[{"type":"string","maxLength":50,"minLength":2,"pattern":"^[a-z0-9][a-z0-9._-]*$"},{"type":"null"}],"title":"Server Type"}},"type":"object","title":"AutoscalerServerTypePin"},"AutoscalingUpdate":{"properties":{"autoscaling_enabled":{"type":"boolean","title":"Autoscaling Enabled"},"min_nodes":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Min Nodes"},"max_nodes":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Nodes"},"server_type":{"anyOf":[{"type":"string","maxLength":50,"minLength":2,"pattern":"^[a-z0-9][a-z0-9._-]*$"},{"type":"null"}],"title":"Server Type"}},"type":"object","required":["autoscaling_enabled","min_nodes","max_nodes"],"title":"AutoscalingUpdate","description":"Schema for updating cluster autoscaling configuration."},"BackingServiceInfo":{"properties":{"type":{"type":"string","title":"Type"},"detected_from":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected From"}},"type":"object","required":["type"],"title":"BackingServiceInfo"},"BackupCreateRequest":{"properties":{"backup_type":{"type":"string","title":"Backup Type","default":"manual"}},"type":"object","title":"BackupCreateRequest"},"BackupStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Path"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"barman_backup_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barman Backup Id"},"barman_server_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barman Server Name"}},"type":"object","required":["status"],"title":"BackupStatusUpdate"},"BackupSyncRequest":{"properties":{"backups":{"items":{"$ref":"#/components/schemas/ObservedBackup"},"type":"array","title":"Backups"}},"type":"object","required":["backups"],"title":"BackupSyncRequest"},"BackupsConfig":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":false},"schedule":{"type":"string","enum":["hourly","daily","weekly"],"title":"Schedule","default":"daily"},"retention_days":{"type":"integer","maximum":90.0,"minimum":1.0,"title":"Retention Days","default":7}},"type":"object","title":"BackupsConfig","description":"Scheduled backup configuration (stored in the deployment config).\n\nBackups capture the deployment's namespace: workload configuration,\nin-namespace secrets, and all persistent volume data. Managed databases\nare excluded — they have their own backup mechanism. Requires a\ndedicated cluster and the \"backups\" feature flag."},"BillingModeUpdate":{"properties":{"billing_mode":{"type":"string","title":"Billing Mode"}},"type":"object","required":["billing_mode"],"title":"BillingModeUpdate"},"BillingStatusResponse":{"properties":{"has_subscription":{"type":"boolean","title":"Has Subscription"},"mandate_verified":{"type":"boolean","title":"Mandate Verified"},"credit_limit":{"type":"number","title":"Credit Limit"},"balance":{"type":"number","title":"Balance"},"available_credit":{"type":"number","title":"Available Credit"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"payment_failures":{"type":"integer","title":"Payment Failures","default":0},"suspended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Suspended At"},"current_period_usage":{"type":"number","title":"Current Period Usage","default":0},"estimated_monthly_cost":{"type":"number","title":"Estimated Monthly Cost","default":0},"trial_active":{"type":"boolean","title":"Trial Active","default":false},"trial_credit_total":{"type":"number","title":"Trial Credit Total","default":0},"trial_credit_remaining":{"type":"number","title":"Trial Credit Remaining","default":0},"platform_fee_waived":{"type":"boolean","title":"Platform Fee Waived","default":false},"deletion_scheduled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Scheduled At"}},"type":"object","required":["has_subscription","mandate_verified","credit_limit","balance","available_credit"],"title":"BillingStatusResponse"},"BillingTransactionResponse":{"properties":{"id":{"type":"string","title":"Id"},"transaction_type":{"type":"string","title":"Transaction Type"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"moneybird_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Moneybird Invoice Id"},"has_invoice":{"type":"boolean","title":"Has Invoice"}},"type":"object","required":["id","transaction_type","amount","currency","status","description","created_at","completed_at","moneybird_invoice_id","has_invoice"],"title":"BillingTransactionResponse"},"BillingTransactionsListResponse":{"properties":{"transactions":{"items":{"$ref":"#/components/schemas/BillingTransactionResponse"},"type":"array","title":"Transactions"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["transactions","total"],"title":"BillingTransactionsListResponse"},"Body_authorize_submit_oauth_authorize_post":{"properties":{"request_token":{"type":"string","title":"Request Token"},"decision":{"type":"string","title":"Decision"}},"type":"object","required":["request_token","decision"],"title":"Body_authorize_submit_oauth_authorize_post"},"Body_revoke_oauth_revoke_post":{"properties":{"token":{"type":"string","title":"Token"},"token_type_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Type Hint"}},"type":"object","required":["token"],"title":"Body_revoke_oauth_revoke_post"},"Body_token_oauth_token_post":{"properties":{"grant_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Grant Type"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"code_verifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Verifier"},"refresh_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refresh Token"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"}},"type":"object","title":"Body_token_oauth_token_post"},"Body_upload_article_image_admin_articles_upload_image_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_article_image_admin_articles_upload_image_post"},"BundleDescriptionUpdate":{"properties":{"description":{"type":"string","title":"Description"}},"type":"object","required":["description"],"title":"BundleDescriptionUpdate"},"BunnyRecord":{"properties":{"id":{"type":"integer","title":"Id"},"type":{"type":"integer","title":"Type"},"ttl":{"type":"integer","title":"Ttl"},"name":{"type":"string","title":"Name"},"value":{"type":"string","title":"Value"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"}},"type":"object","required":["id","type","ttl","name","value"],"title":"BunnyRecord","description":"A DNS record from Bunny.net API."},"BunnyRecordListResponse":{"properties":{"records":{"items":{"$ref":"#/components/schemas/BunnyRecord"},"type":"array","title":"Records"}},"type":"object","required":["records"],"title":"BunnyRecordListResponse","description":"List of DNS records for a zone."},"BunnyZone":{"properties":{"id":{"type":"integer","title":"Id"},"domain":{"type":"string","title":"Domain"}},"type":"object","required":["id","domain"],"title":"BunnyZone","description":"A DNS zone from Bunny.net API."},"BunnyZoneListResponse":{"properties":{"zones":{"items":{"$ref":"#/components/schemas/BunnyZone"},"type":"array","title":"Zones"}},"type":"object","required":["zones"],"title":"BunnyZoneListResponse","description":"List of Bunny.net DNS zones."},"CampaignPreviewResponse":{"properties":{"name":{"type":"string","title":"Name"},"trial_credit_eur":{"type":"number","title":"Trial Credit Eur"},"status":{"type":"string","title":"Status"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["name","trial_credit_eur","status","expires_at"],"title":"CampaignPreviewResponse"},"CampaignRedeemResponse":{"properties":{"granted_eur":{"type":"number","title":"Granted Eur"}},"type":"object","required":["granted_eur"],"title":"CampaignRedeemResponse"},"CapacityCheckRequest":{"properties":{"kind":{"type":"string","enum":["deployment","database"],"title":"Kind"},"cpu_request":{"type":"number","exclusiveMinimum":0.0,"title":"Cpu Request","default":0.5},"memory_request_mb":{"type":"integer","exclusiveMinimum":0.0,"title":"Memory Request Mb","default":512},"replicas":{"type":"integer","minimum":0.0,"title":"Replicas","default":1},"deployment_type":{"type":"string","title":"Deployment Type","default":"docker"},"engine":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Engine"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","default":"single"},"exclude_deployment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Exclude Deployment Id"},"exclude_database_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Exclude Database Id"}},"type":"object","required":["kind"],"title":"CapacityCheckRequest","description":"Describe the workload the user is about to create or resize."},"CapacityCheckResponse":{"properties":{"applies":{"type":"boolean","title":"Applies"},"fits":{"type":"boolean","title":"Fits"},"required":{"$ref":"#/components/schemas/ResourceAmountResponse"},"free":{"$ref":"#/components/schemas/ResourceAmountResponse"},"quota":{"$ref":"#/components/schemas/ResourceAmountResponse"},"used":{"$ref":"#/components/schemas/ResourceAmountResponse"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["applies","fits","required","free","quota","used"],"title":"CapacityCheckResponse","description":"`applies` is false when the cluster has no quota to check against\n(not shared, not running, or the host could not be read); `fits` is then\ntrue and the amounts are zero."},"CloudCredentialCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"User-friendly name"},"provider":{"type":"string","title":"Provider","description":"Cloud provider: aws, gcp, azure, hetzner, scaleway, thalassa, digitalocean"},"credentials":{"additionalProperties":true,"type":"object","title":"Credentials","description":"Provider-specific credentials"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id","description":"Active org; defaults to the user's personal org"}},"type":"object","required":["name","provider","credentials"],"title":"CloudCredentialCreate","description":"Create a new cloud credential."},"CloudCredentialListResponse":{"properties":{"credentials":{"items":{"$ref":"#/components/schemas/CloudCredentialResponse"},"type":"array","title":"Credentials"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["credentials","total"],"title":"CloudCredentialListResponse","description":"List of cloud credentials."},"CloudCredentialResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"provider":{"type":"string","title":"Provider"},"status":{"type":"string","title":"Status"},"is_valid":{"type":"boolean","title":"Is Valid"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error"},"last_validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Validated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","provider","status","is_valid","created_at","updated_at"],"title":"CloudCredentialResponse","description":"Response schema for a cloud credential (excludes sensitive data)."},"CloudCredentialValidationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"is_valid":{"type":"boolean","title":"Is Valid"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error"},"validated_at":{"type":"string","format":"date-time","title":"Validated At"}},"type":"object","required":["id","is_valid","validated_at"],"title":"CloudCredentialValidationResponse","description":"Response from credential validation."},"ClusterAndDeploymentCreate":{"properties":{"cluster_name":{"type":"string","title":"Cluster Name"},"provider":{"type":"string","title":"Provider"},"region":{"type":"string","title":"Region"},"tier":{"$ref":"#/components/schemas/ClusterTier","default":"dedicated"},"server_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Type"},"deployment_name":{"type":"string","title":"Deployment Name"},"app_type":{"type":"string","title":"App Type","default":"helm"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request","default":0.5},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb","default":512},"replicas":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replicas","default":1},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port","default":8080},"environment_variables":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Environment Variables"},"storage_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Size Gb"},"volumes":{"anyOf":[{"items":{"$ref":"#/components/schemas/VolumeConfig"},"type":"array"},{"type":"null"}],"title":"Volumes"},"run_as_uid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run As Uid"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"deployment_type":{"type":"string","title":"Deployment Type","default":"docker"},"helm_repo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Repo Url"},"helm_chart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Name"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"image_update_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Strategy"},"image_update_constraint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Constraint"},"image_allow_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Allow Tags"},"image_ignore_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Ignore Tags"},"helm_ingress_values":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Helm Ingress Values"}},"type":"object","required":["cluster_name","provider","region","deployment_name"],"title":"ClusterAndDeploymentCreate","description":"Combined request for creating a cluster and deployment together."},"ClusterArgocdUrlUpdate":{"properties":{"argocd_url":{"type":"string","title":"Argocd Url"}},"type":"object","required":["argocd_url"],"title":"ClusterArgocdUrlUpdate"},"ClusterAutoscalerServerTypeUpdate":{"properties":{"autoscaler_server_type":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"Autoscaler Server Type"}},"type":"object","title":"ClusterAutoscalerServerTypeUpdate"},"ClusterAwsInfoUpdate":{"properties":{"aws_vpc_id":{"type":"string","title":"Aws Vpc Id"},"aws_lb_controller_role_arn":{"type":"string","title":"Aws Lb Controller Role Arn"}},"type":"object","required":["aws_vpc_id","aws_lb_controller_role_arn"],"title":"ClusterAwsInfoUpdate"},"ClusterControlPlaneServerTypeUpdate":{"properties":{"control_plane_server_type":{"anyOf":[{"type":"string","maxLength":50,"minLength":2},{"type":"null"}],"title":"Control Plane Server Type"}},"type":"object","title":"ClusterControlPlaneServerTypeUpdate"},"ClusterCreate":{"properties":{"name":{"type":"string","title":"Name"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"geographic_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geographic Region"},"tier":{"$ref":"#/components/schemas/ClusterTier","default":"dedicated"},"server_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Type"},"kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubernetes Version"},"component_bundle_version":{"type":"string","title":"Component Bundle Version","default":"stable"},"autoscaling_enabled":{"type":"boolean","title":"Autoscaling Enabled","default":false},"min_nodes":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Min Nodes"},"max_nodes":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Max Nodes"},"multi_region":{"type":"boolean","title":"Multi Region","default":false},"region_locations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Region Locations"},"use_byoc":{"type":"boolean","title":"Use Byoc","default":false},"cloud_credential_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cloud Credential Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}},"type":"object","required":["name"],"title":"ClusterCreate"},"ClusterHetznerProjectUpdate":{"properties":{"hetzner_project_id":{"type":"string","title":"Hetzner Project Id"},"hetzner_api_token":{"type":"string","title":"Hetzner Api Token"}},"type":"object","required":["hetzner_project_id","hetzner_api_token"],"title":"ClusterHetznerProjectUpdate"},"ClusterImport":{"properties":{"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"region":{"type":"string","title":"Region"},"cloud_credential_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cloud Credential Id"},"provider_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Cluster Id"},"kubeconfig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubeconfig"},"is_autopilot":{"type":"boolean","title":"Is Autopilot","default":false},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"acknowledge_bundle_install":{"type":"boolean","title":"Acknowledge Bundle Install"},"override_preflight":{"type":"boolean","title":"Override Preflight","default":false}},"type":"object","required":["name","provider","region","acknowledge_bundle_install"],"title":"ClusterImport","description":"Schema for importing an existing Kubernetes cluster."},"ClusterImportedUpdate":{"properties":{"admin_kubeconfig":{"type":"string","title":"Admin Kubeconfig"},"api_endpoint":{"type":"string","title":"Api Endpoint"}},"type":"object","required":["admin_kubeconfig","api_endpoint"],"title":"ClusterImportedUpdate"},"ClusterIngressAddressUpdate":{"properties":{"ingress_address":{"type":"string","title":"Ingress Address"}},"type":"object","required":["ingress_address"],"title":"ClusterIngressAddressUpdate"},"ClusterInitialServerTypeUpdate":{"properties":{"initial_server_type":{"type":"string","maxLength":50,"minLength":1,"title":"Initial Server Type"}},"type":"object","required":["initial_server_type"],"title":"ClusterInitialServerTypeUpdate"},"ClusterInventory":{"properties":{"nodes":{"items":{"$ref":"#/components/schemas/InventoryNode"},"type":"array","title":"Nodes","default":[]},"load_balancer_count":{"type":"integer","title":"Load Balancer Count","default":0},"volume_gb":{"type":"number","title":"Volume Gb","default":0}},"type":"object","title":"ClusterInventory","description":"Normalized cluster resources read from the Kubernetes API, priced by the\nper-provider catalog. Provider-agnostic."},"ClusterKubeconfigUpdate":{"properties":{"kubeconfig":{"type":"string","title":"Kubeconfig"}},"type":"object","required":["kubeconfig"],"title":"ClusterKubeconfigUpdate"},"ClusterListResponse":{"properties":{"clusters":{"items":{"$ref":"#/components/schemas/ClusterResponse"},"type":"array","title":"Clusters"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["clusters","total"],"title":"ClusterListResponse"},"ClusterManagementUpdate":{"properties":{"argocd_admin_password":{"type":"string","title":"Argocd Admin Password"}},"type":"object","required":["argocd_admin_password"],"title":"ClusterManagementUpdate"},"ClusterProvisionedServerTypeUpdate":{"properties":{"server_type":{"type":"string","maxLength":50,"minLength":2,"title":"Server Type"}},"type":"object","required":["server_type"],"title":"ClusterProvisionedServerTypeUpdate"},"ClusterProvisionedUpdate":{"properties":{"kubeconfig":{"type":"string","title":"Kubeconfig"},"api_endpoint":{"type":"string","title":"Api Endpoint"},"pulumi_stack_name":{"type":"string","title":"Pulumi Stack Name"},"kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubernetes Version"}},"type":"object","required":["kubeconfig","api_endpoint","pulumi_stack_name"],"title":"ClusterProvisionedUpdate"},"ClusterProvisioningVersionUpdate":{"properties":{"kubernetes_version":{"type":"string","minLength":1,"title":"Kubernetes Version"}},"type":"object","required":["kubernetes_version"],"title":"ClusterProvisioningVersionUpdate"},"ClusterRegionUpdate":{"properties":{"region":{"type":"string","title":"Region"}},"type":"object","required":["region"],"title":"ClusterRegionUpdate"},"ClusterRegistrationCreate":{"properties":{"management_cluster_id":{"type":"string","title":"Management Cluster Id"},"client_cluster_id":{"type":"string","title":"Client Cluster Id"}},"type":"object","required":["management_cluster_id","client_cluster_id"],"title":"ClusterRegistrationCreate"},"ClusterReorderRequest":{"properties":{"cluster_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Cluster Ids"}},"type":"object","required":["cluster_ids"],"title":"ClusterReorderRequest","description":"Request to reorder clusters on the dashboard.\n\nContains an ordered list of cluster IDs in the desired display order."},"ClusterResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"region":{"type":"string","title":"Region"},"tier":{"$ref":"#/components/schemas/ClusterTier"},"status":{"$ref":"#/components/schemas/ClusterStatus"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubernetes Version"},"server_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Type"},"argocd_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Argocd Url"},"git_repo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Repo Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"provisioning_started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Provisioning Started At"},"provisioning_completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Provisioning Completed At"},"autoscaling_enabled":{"type":"boolean","title":"Autoscaling Enabled","default":false},"min_nodes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Min Nodes"},"max_nodes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Nodes"},"target_kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Kubernetes Version"},"upgrade_available":{"type":"boolean","title":"Upgrade Available","default":false},"upgrade_available_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Available Version"},"scheduled_upgrade_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Upgrade Date"},"scheduled_upgrade_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Scheduled Upgrade Id"},"component_bundle_version":{"type":"string","title":"Component Bundle Version","default":"stable"},"multi_region":{"type":"boolean","title":"Multi Region","default":false},"region_locations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Region Locations"},"is_byoc":{"type":"boolean","title":"Is Byoc","default":false},"cloud_credential_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cloud Credential Id"},"is_imported":{"type":"boolean","title":"Is Imported","default":false},"is_management":{"type":"boolean","title":"Is Management","default":false},"is_autopilot":{"type":"boolean","title":"Is Autopilot","default":false},"display_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Order"}},"type":"object","required":["id","name","provider","region","tier","status","created_at","updated_at"],"title":"ClusterResponse"},"ClusterRetry":{"properties":{"region":{"type":"string","title":"Region"}},"type":"object","required":["region"],"title":"ClusterRetry","description":"Schema for retrying a failed cluster with a new region."},"ClusterStackNameUpdate":{"properties":{"pulumi_stack_name":{"type":"string","title":"Pulumi Stack Name"}},"type":"object","required":["pulumi_stack_name"],"title":"ClusterStackNameUpdate"},"ClusterStatus":{"type":"string","enum":["pending","provisioning","importing","running","upgrading","error","deleting"],"title":"ClusterStatus"},"ClusterStatusUpdate":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/ClusterStatus"},{"type":"null"}]},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"status_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Message"},"target_kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Kubernetes Version"}},"type":"object","title":"ClusterStatusUpdate"},"ClusterTier":{"type":"string","enum":["shared","dedicated","production"],"title":"ClusterTier"},"ClusterTimingUpdate":{"properties":{"provisioning_started_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provisioning Started At"},"provisioning_completed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provisioning Completed At"}},"type":"object","title":"ClusterTimingUpdate"},"ClusterUsageBatch":{"properties":{"records":{"items":{"$ref":"#/components/schemas/ClusterUsageRecord"},"type":"array","title":"Records"}},"type":"object","required":["records"],"title":"ClusterUsageBatch","description":"Batch of cluster usage records from the worker."},"ClusterUsageRecord":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id"},"period_start":{"type":"string","title":"Period Start"},"period_end":{"type":"string","title":"Period End"},"seconds":{"type":"integer","title":"Seconds"},"cpu_millicores":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cpu Millicores"},"memory_mi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Mi"},"node_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Node Count"},"cpu_requests_millicores":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cpu Requests Millicores"},"memory_requests_mi":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Requests Mi"},"inventory":{"anyOf":[{"$ref":"#/components/schemas/ClusterInventory"},{"type":"null"}]}},"type":"object","required":["cluster_id","period_start","period_end","seconds"],"title":"ClusterUsageRecord","description":"Schema for recording cluster usage with per-second billing."},"ClusterVersionUpdate":{"properties":{"kubernetes_version":{"type":"string","title":"Kubernetes Version"},"status":{"type":"string","title":"Status","default":"running"},"target_kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Kubernetes Version"},"upgrade_available":{"type":"boolean","title":"Upgrade Available","default":false},"upgrade_available_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Available Version"}},"type":"object","required":["kubernetes_version"],"title":"ClusterVersionUpdate","description":"Update cluster Kubernetes version after upgrade."},"ClusterZoneInfoUpdate":{"properties":{"zone_infra_id":{"type":"string","title":"Zone Infra Id"},"subnet_index":{"type":"integer","title":"Subnet Index"},"api_lb_port":{"type":"integer","title":"Api Lb Port"},"supervisor_lb_port":{"type":"integer","title":"Supervisor Lb Port"}},"type":"object","required":["zone_infra_id","subnet_index","api_lb_port","supervisor_lb_port"],"title":"ClusterZoneInfoUpdate"},"ComponentBundleListResponse":{"properties":{"bundles":{"items":{"$ref":"#/components/schemas/ComponentBundleResponse"},"type":"array","title":"Bundles"}},"type":"object","required":["bundles"],"title":"ComponentBundleListResponse","description":"List of component bundles."},"ComponentBundleResponse":{"properties":{"version":{"type":"string","title":"Version"},"git_tag":{"type":"string","title":"Git Tag"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"release_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Notes"},"is_stable":{"type":"boolean","title":"Is Stable","default":false},"is_latest":{"type":"boolean","title":"Is Latest","default":false},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["version","git_tag"],"title":"ComponentBundleResponse","description":"Response schema for a component bundle (from git tags)."},"ComponentBundleUpdate":{"properties":{"version":{"type":"string","title":"Version"}},"type":"object","required":["version"],"title":"ComponentBundleUpdate","description":"Update a cluster's component bundle version."},"ConnectedAppListResponse":{"properties":{"applications":{"items":{"$ref":"#/components/schemas/ConnectedAppResponse"},"type":"array","title":"Applications"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["applications","total"],"title":"ConnectedAppListResponse"},"ConnectedAppResponse":{"properties":{"client_id":{"type":"string","title":"Client Id"},"client_name":{"type":"string","title":"Client Name"},"client_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Uri"},"logo_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Uri"},"authorized_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Authorized At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"active_sessions":{"type":"integer","title":"Active Sessions"}},"type":"object","required":["client_id","client_name","active_sessions"],"title":"ConnectedAppResponse"},"ContactRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"message":{"type":"string","title":"Message"}},"type":"object","required":["email","message"],"title":"ContactRequest"},"ContactResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"ContactResponse"},"ControlPlaneReplacementRequest":{"properties":{"server_type":{"type":"string","maxLength":50,"minLength":2,"pattern":"^[a-z0-9][a-z0-9._-]*$","title":"Server Type"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","required":["server_type"],"title":"ControlPlaneReplacementRequest"},"CountryListResponse":{"properties":{"countries":{"items":{"$ref":"#/components/schemas/CountryOption"},"type":"array","title":"Countries"}},"type":"object","required":["countries"],"title":"CountryListResponse","description":"List of countries for dropdown."},"CountryOption":{"properties":{"code":{"type":"string","title":"Code"},"name":{"type":"string","title":"Name"},"is_eu":{"type":"boolean","title":"Is Eu"}},"type":"object","required":["code","name","is_eu"],"title":"CountryOption","description":"Country option for dropdown."},"CreateMissingBucketsRequest":{"properties":{"region":{"type":"string","title":"Region","description":"S3 storage region (nl-ams, fr-par, pl-waw)","default":"nl-ams"},"include_dev":{"type":"boolean","title":"Include Dev","description":"Create development buckets instead of production buckets","default":false}},"type":"object","title":"CreateMissingBucketsRequest","description":"Request to create missing required storage buckets."},"CreateMissingBucketsResponse":{"properties":{"created":{"items":{"type":"string"},"type":"array","title":"Created"},"skipped":{"items":{"type":"string"},"type":"array","title":"Skipped"},"failed":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Failed"}},"type":"object","required":["created","skipped","failed"],"title":"CreateMissingBucketsResponse","description":"Response for creating missing storage buckets."},"CredentialStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error"}},"type":"object","required":["status"],"title":"CredentialStatusUpdate","description":"Update credential status during provisioning lifecycle."},"CurrentUsageResponse":{"properties":{"current_balance":{"type":"number","title":"Current Balance"},"credit_limit":{"type":"number","title":"Credit Limit"},"available_credit":{"type":"number","title":"Available Credit"},"current_period_usage":{"type":"number","title":"Current Period Usage"},"current_period_management_fee":{"type":"number","title":"Current Period Management Fee"},"estimated_monthly_cost":{"type":"number","title":"Estimated Monthly Cost"},"estimated_monthly_management_fee":{"type":"number","title":"Estimated Monthly Management Fee"},"deployments":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Deployments"}},"type":"object","required":["current_balance","credit_limit","available_credit","current_period_usage","current_period_management_fee","estimated_monthly_cost","estimated_monthly_management_fee","deployments"],"title":"CurrentUsageResponse","description":"Current usage and cost estimate."},"CustomerRevenueResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"month_revenue":{"type":"number","title":"Month Revenue"},"year_revenue":{"type":"number","title":"Year Revenue"},"total_revenue":{"type":"number","title":"Total Revenue"},"transaction_count":{"type":"integer","title":"Transaction Count"}},"type":"object","required":["user_id","email","name","month_revenue","year_revenue","total_revenue","transaction_count"],"title":"CustomerRevenueResponse"},"DNSCredentialCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"User-friendly name"},"provider":{"type":"string","title":"Provider","description":"DNS provider: one of bunny, cloudflare, digitalocean, route53"},"credentials":{"additionalProperties":{"type":"string"},"type":"object","title":"Credentials","description":"Provider-specific credential fields"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key","description":"Deprecated: use credentials.api_key"},"managed_domain":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Managed Domain","description":"DNS zone this credential manages (e.g. example.com)"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id","description":"Active org; defaults to the user's personal org"}},"type":"object","required":["name","provider"],"title":"DNSCredentialCreate","description":"Create a new DNS credential (multi-provider)."},"DNSCredentialListResponse":{"properties":{"credentials":{"items":{"$ref":"#/components/schemas/DNSCredentialResponse"},"type":"array","title":"Credentials"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["credentials","total"],"title":"DNSCredentialListResponse","description":"List of DNS credentials."},"DNSCredentialResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"provider":{"type":"string","title":"Provider"},"managed_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Managed Domain"},"is_valid":{"type":"boolean","title":"Is Valid"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error"},"last_validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Validated At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","provider","is_valid","created_at","updated_at"],"title":"DNSCredentialResponse","description":"Response schema for a DNS credential (excludes sensitive data)."},"DNSCredentialValidationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"is_valid":{"type":"boolean","title":"Is Valid"},"validation_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Error"},"validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Validated At"}},"type":"object","required":["id","is_valid"],"title":"DNSCredentialValidationResponse","description":"Response from credential validation."},"DNSRecordRequest":{"properties":{"name":{"type":"string","title":"Name"},"ip":{"type":"string","title":"Ip"},"ttl":{"type":"integer","title":"Ttl","default":300}},"type":"object","required":["name","ip"],"title":"DNSRecordRequest"},"DatabaseBackupListResponse":{"properties":{"backups":{"items":{"$ref":"#/components/schemas/DatabaseBackupResponse"},"type":"array","title":"Backups"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["backups","total"],"title":"DatabaseBackupListResponse"},"DatabaseBackupResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"database_instance_id":{"type":"string","format":"uuid","title":"Database Instance Id"},"backup_type":{"type":"string","title":"Backup Type"},"status":{"type":"string","title":"Status"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Path"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","database_instance_id","backup_type","status","created_at"],"title":"DatabaseBackupResponse"},"DatabaseCloneRequest":{"properties":{"target_cluster_id":{"type":"string","format":"uuid","title":"Target Cluster Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["target_cluster_id"],"title":"DatabaseCloneRequest"},"DatabaseCreate":{"properties":{"cluster_id":{"type":"string","format":"uuid","title":"Cluster Id"},"name":{"type":"string","title":"Name"},"engine":{"$ref":"#/components/schemas/DatabaseEngine"},"engine_version":{"type":"string","title":"Engine Version"},"tier":{"$ref":"#/components/schemas/DatabaseTier","default":"single"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request","default":0.5},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb","default":512},"storage_size_gb":{"type":"integer","title":"Storage Size Gb","default":10},"database_name":{"type":"string","title":"Database Name","default":"app"},"max_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Connections","default":100},"extensions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Extensions"},"backup_enabled":{"type":"boolean","title":"Backup Enabled","default":true},"backup_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Schedule","default":"0 2 * * *"},"backup_retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Retention Days","default":7},"external_access":{"type":"boolean","title":"External Access","default":false},"restore_from_database_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Restore From Database Id"}},"type":"object","required":["cluster_id","name","engine","engine_version"],"title":"DatabaseCreate"},"DatabaseCredentialsResponse":{"properties":{"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Port"},"database":{"type":"string","title":"Database"},"username":{"type":"string","title":"Username"},"secret_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Name"},"connection_string":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection String"},"external_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Host"},"external_connection_string":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Connection String"}},"type":"object","required":["database","username"],"title":"DatabaseCredentialsResponse"},"DatabaseEngine":{"type":"string","enum":["postgresql","mysql"],"title":"DatabaseEngine"},"DatabaseListResponse":{"properties":{"databases":{"items":{"$ref":"#/components/schemas/DatabaseResponse"},"type":"array","title":"Databases"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["databases","total"],"title":"DatabaseListResponse"},"DatabaseResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"cluster_id":{"type":"string","format":"uuid","title":"Cluster Id"},"name":{"type":"string","title":"Name"},"engine":{"$ref":"#/components/schemas/DatabaseEngine"},"engine_version":{"type":"string","title":"Engine Version"},"tier":{"$ref":"#/components/schemas/DatabaseTier"},"status":{"$ref":"#/components/schemas/DatabaseStatus"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request"},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb"},"storage_size_gb":{"type":"integer","title":"Storage Size Gb"},"replicas":{"type":"integer","title":"Replicas"},"database_name":{"type":"string","title":"Database Name"},"max_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Connections"},"extensions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Extensions"},"external_access":{"type":"boolean","title":"External Access","default":false},"external_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Host"},"connection_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Host"},"connection_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connection Port"},"connection_secret_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Secret Name"},"backup_enabled":{"type":"boolean","title":"Backup Enabled"},"backup_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Schedule"},"backup_retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Retention Days"},"git_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Path"},"argocd_app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Argocd App Name"},"replication_group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Replication Group Id"},"replication_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replication Role"},"replication_source_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Replication Source Id"},"replication_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replication Host"},"replication_lag_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replication Lag Bytes"},"replication_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Replication Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"fee_exempt_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fee Exempt Until"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","cluster_id","name","engine","engine_version","tier","status","storage_size_gb","replicas","database_name","backup_enabled","created_at","updated_at"],"title":"DatabaseResponse"},"DatabaseStatus":{"type":"string","enum":["pending","provisioning","running","degraded","upgrading","error","deleting","restoring"],"title":"DatabaseStatus"},"DatabaseStatusUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"git_commit_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Commit Sha"},"connection_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Host"},"connection_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Connection Port"},"connection_secret_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Secret Name"},"external_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Host"},"expected_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Status"},"barman_server_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barman Server Name"}},"type":"object","title":"DatabaseStatusUpdate"},"DatabaseTier":{"type":"string","enum":["single","ha","replicated"],"title":"DatabaseTier"},"DatabaseUpdate":{"properties":{"storage_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Size Gb"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request"},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb"},"max_connections":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Connections"},"extensions":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Extensions"},"backup_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Backup Enabled"},"backup_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Schedule"},"backup_retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Retention Days"},"external_access":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"External Access"}},"type":"object","title":"DatabaseUpdate"},"DeploymentBackup":{"properties":{"name":{"type":"string","title":"Name"},"phase":{"type":"string","title":"Phase"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"errors":{"type":"integer","title":"Errors","default":0},"warnings":{"type":"integer","title":"Warnings","default":0},"schedule_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Name"}},"type":"object","required":["name","phase"],"title":"DeploymentBackup","description":"Summary of one Velero backup of a deployment's namespace."},"DeploymentBackupList":{"properties":{"backups":{"items":{"$ref":"#/components/schemas/DeploymentBackup"},"type":"array","title":"Backups"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["backups","total"],"title":"DeploymentBackupList"},"DeploymentCreate":{"properties":{"cluster_id":{"type":"string","format":"uuid","title":"Cluster Id"},"name":{"type":"string","title":"Name"},"app_type":{"$ref":"#/components/schemas/AppType","default":"helm"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request","default":0.5},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb","default":512},"replicas":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Replicas","default":1},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port","default":8080},"environment_variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},{"type":"null"}],"title":"Environment Variables"},"storage_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Size Gb"},"volumes":{"anyOf":[{"items":{"$ref":"#/components/schemas/VolumeConfig"},"type":"array"},{"type":"null"}],"title":"Volumes"},"run_as_uid":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run As Uid"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"deployment_type":{"type":"string","title":"Deployment Type","default":"docker"},"helm_repo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Repo Url"},"helm_chart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Name"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"image_update_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Strategy"},"image_update_constraint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Constraint"},"image_allow_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Allow Tags"},"image_ignore_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Ignore Tags"},"custom_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Domain"},"failover_health_route":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Failover Health Route"},"helm_ingress_values":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Helm Ingress Values"},"health_checks":{"anyOf":[{"$ref":"#/components/schemas/HealthChecksConfig"},{"type":"null"}]},"additional_ports":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdditionalPort"},"type":"array"},{"type":"null"}],"title":"Additional Ports"},"backups":{"anyOf":[{"$ref":"#/components/schemas/BackupsConfig"},{"type":"null"}]},"command":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"}},"type":"object","required":["cluster_id","name"],"title":"DeploymentCreate"},"DeploymentEndpointUpdate":{"properties":{"endpoint_url":{"type":"string","title":"Endpoint Url"}},"type":"object","required":["endpoint_url"],"title":"DeploymentEndpointUpdate"},"DeploymentListResponse":{"properties":{"deployments":{"items":{"$ref":"#/components/schemas/DeploymentResponse"},"type":"array","title":"Deployments"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["deployments","total"],"title":"DeploymentListResponse"},"DeploymentMetricsCreate":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id"},"provider":{"type":"string","title":"Provider"},"tier":{"type":"string","title":"Tier"},"region":{"type":"string","title":"Region"},"total_duration_seconds":{"type":"integer","title":"Total Duration Seconds"},"success":{"type":"boolean","title":"Success","default":true}},"type":"object","required":["cluster_id","provider","tier","region","total_duration_seconds"],"title":"DeploymentMetricsCreate"},"DeploymentPromotionRequest":{"properties":{"target_cluster_id":{"type":"string","format":"uuid","title":"Target Cluster Id"},"new_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"New Name"},"delete_source":{"type":"boolean","title":"Delete Source","default":false},"overrides":{"anyOf":[{"$ref":"#/components/schemas/DeploymentUpdate"},{"type":"null"}]}},"type":"object","required":["target_cluster_id"],"title":"DeploymentPromotionRequest","description":"Request to promote/migrate a deployment to another cluster."},"DeploymentPromotionResponse":{"properties":{"source_deployment_id":{"type":"string","format":"uuid","title":"Source Deployment Id"},"new_deployment_id":{"type":"string","format":"uuid","title":"New Deployment Id"},"target_cluster_id":{"type":"string","format":"uuid","title":"Target Cluster Id"},"source_deleted":{"type":"boolean","title":"Source Deleted"},"message":{"type":"string","title":"Message"}},"type":"object","required":["source_deployment_id","new_deployment_id","target_cluster_id","source_deleted","message"],"title":"DeploymentPromotionResponse","description":"Response after promoting a deployment."},"DeploymentRecommendations":{"properties":{"replicas":{"type":"integer","title":"Replicas","default":2},"resources":{"anyOf":[{"$ref":"#/components/schemas/ResourceRequirements"},{"type":"null"}]}},"type":"object","title":"DeploymentRecommendations"},"DeploymentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"cluster_id":{"type":"string","format":"uuid","title":"Cluster Id"},"name":{"type":"string","title":"Name"},"app_type":{"$ref":"#/components/schemas/AppType"},"status":{"$ref":"#/components/schemas/DeploymentStatus"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Values Yaml"},"git_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Path"},"endpoint_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request"},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb"},"replicas":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replicas"},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port"},"storage_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Size Gb"},"command":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"},"deployment_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Type"},"helm_repo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Repo Url"},"helm_chart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Name"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"image_update_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Strategy"},"image_update_constraint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Constraint"},"image_allow_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Allow Tags"},"image_ignore_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Ignore Tags"},"is_adopted":{"type":"boolean","title":"Is Adopted","default":false},"source_namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Namespace"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"cluster_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Status"},"cluster_error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cluster Error"}},"type":"object","required":["id","user_id","cluster_id","name","app_type","status","created_at","updated_at"],"title":"DeploymentResponse"},"DeploymentRestoreList":{"properties":{"restores":{"items":{"$ref":"#/components/schemas/DeploymentRestoreResponse"},"type":"array","title":"Restores"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["restores","total"],"title":"DeploymentRestoreList"},"DeploymentRestoreQueued":{"properties":{"status":{"type":"string","title":"Status"},"restore_id":{"type":"string","format":"uuid","title":"Restore Id"}},"type":"object","required":["status","restore_id"],"title":"DeploymentRestoreQueued"},"DeploymentRestoreResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"deployment_id":{"type":"string","format":"uuid","title":"Deployment Id"},"backup_name":{"type":"string","title":"Backup Name"},"safety_backup_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Safety Backup Name"},"status":{"type":"string","title":"Status"},"step":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Step"},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","deployment_id","backup_name","status","created_at"],"title":"DeploymentRestoreResponse","description":"One restore of a deployment from a backup, with its progress."},"DeploymentRestoreStatus":{"type":"string","enum":["queued","running","completed","failed","rolled_back"],"title":"DeploymentRestoreStatus"},"DeploymentRestoreUpdate":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/DeploymentRestoreStatus"},{"type":"null"}]},"step":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Step"},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"safety_backup_name":{"anyOf":[{"type":"string","maxLength":253},{"type":"null"}],"title":"Safety Backup Name"}},"type":"object","title":"DeploymentRestoreUpdate","description":"Progress report from the worker (internal API)."},"DeploymentStatus":{"type":"string","enum":["pending","provisioning","promoting","running","stopped","failed","error","migrating","deleting"],"title":"DeploymentStatus"},"DeploymentStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"git_commit_sha":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Commit Sha"},"git_sync_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Git Sync Status"}},"type":"object","required":["status"],"title":"DeploymentStatusUpdate"},"DeploymentUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request"},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb"},"replicas":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Replicas"},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port"},"storage_size_gb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Storage Size Gb"},"environment_variables":{"anyOf":[{"items":{"$ref":"#/components/schemas/EnvironmentVariable"},"type":"array"},{"type":"null"}],"title":"Environment Variables"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"volumes":{"anyOf":[{"items":{"$ref":"#/components/schemas/VolumeConfig"},"type":"array"},{"type":"null"}],"title":"Volumes"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"image_update_strategy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Strategy"},"image_update_constraint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Update Constraint"},"image_allow_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Allow Tags"},"image_ignore_tags":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Ignore Tags"},"custom_domain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Domain"},"failover_health_route":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Failover Health Route"},"helm_ingress_values":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Helm Ingress Values"},"health_checks":{"anyOf":[{"$ref":"#/components/schemas/HealthChecksConfig"},{"type":"null"}]},"additional_ports":{"anyOf":[{"items":{"$ref":"#/components/schemas/AdditionalPort"},"type":"array"},{"type":"null"}],"title":"Additional Ports"},"backups":{"anyOf":[{"$ref":"#/components/schemas/BackupsConfig"},{"type":"null"}]},"command":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"}},"type":"object","title":"DeploymentUpdate"},"DeploymentValuesResponse":{"properties":{"deployment_id":{"type":"string","format":"uuid","title":"Deployment Id"},"values_yaml":{"type":"string","title":"Values Yaml"},"git_path":{"type":"string","title":"Git Path"}},"type":"object","required":["deployment_id","values_yaml","git_path"],"title":"DeploymentValuesResponse"},"DiscoveredWorkload":{"properties":{"name":{"type":"string","title":"Name"},"namespace":{"type":"string","title":"Namespace"},"kind":{"type":"string","title":"Kind"},"helm_chart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Name"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"helm_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Status"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"replicas":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replicas"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request"},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb"},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port"},"service_account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Account Name"},"selector_match_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Selector Match Labels"},"pod_template_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Pod Template Labels"},"manifest_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Yaml"},"command":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"},"extra_pod_spec_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Pod Spec Yaml"},"extra_container_spec_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Container Spec Yaml"},"is_helm_managed":{"type":"boolean","title":"Is Helm Managed","default":false},"already_imported":{"type":"boolean","title":"Already Imported","default":false}},"type":"object","required":["name","namespace","kind"],"title":"DiscoveredWorkload","description":"A workload discovered from a running Kubernetes cluster."},"DiscoveredWorkloadListResponse":{"properties":{"workloads":{"items":{"$ref":"#/components/schemas/DiscoveredWorkload"},"type":"array","title":"Workloads"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["workloads","total"],"title":"DiscoveredWorkloadListResponse"},"DockerImageAnalysis":{"properties":{"image_info":{"anyOf":[{"$ref":"#/components/schemas/ImageInfo"},{"type":"null"}]},"ports":{"items":{"$ref":"#/components/schemas/PortInfo"},"type":"array","title":"Ports","default":[]},"volumes":{"items":{"$ref":"#/components/schemas/VolumeInfo"},"type":"array","title":"Volumes","default":[]},"environment_variables":{"items":{"$ref":"#/components/schemas/EnvVarInfo"},"type":"array","title":"Environment Variables","default":[]},"backing_services":{"items":{"$ref":"#/components/schemas/BackingServiceInfo"},"type":"array","title":"Backing Services","default":[]},"twelve_factor":{"anyOf":[{"$ref":"#/components/schemas/TwelveFactorAnalysis"},{"type":"null"}]},"healthcheck":{"anyOf":[{"$ref":"#/components/schemas/HealthcheckInfo"},{"type":"null"}]},"suggestions":{"items":{"type":"string"},"type":"array","title":"Suggestions","default":[]},"deployment_recommendations":{"anyOf":[{"$ref":"#/components/schemas/DeploymentRecommendations"},{"type":"null"}]}},"type":"object","title":"DockerImageAnalysis"},"DockerImageAnalysisRequest":{"properties":{"image_reference":{"type":"string","title":"Image Reference"}},"type":"object","required":["image_reference"],"title":"DockerImageAnalysisRequest"},"DockerImageAnalysisResponse":{"properties":{"analysis":{"$ref":"#/components/schemas/DockerImageAnalysis"},"suggested_services":{"items":{"$ref":"#/components/schemas/SuggestedService"},"type":"array","title":"Suggested Services","default":[]},"service_recommendations":{"items":{"$ref":"#/components/schemas/ServiceRecommendation"},"type":"array","title":"Service Recommendations","default":[]},"usage":{"additionalProperties":true,"type":"object","title":"Usage"},"metadata_source":{"type":"string","title":"Metadata Source"},"dotenv_files":{"items":{"type":"string"},"type":"array","title":"Dotenv Files","default":[]},"dotenv_scan_complete":{"type":"boolean","title":"Dotenv Scan Complete","default":true},"image_exists":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Image Exists"},"warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Warning"}},"type":"object","required":["analysis","usage","metadata_source"],"title":"DockerImageAnalysisResponse"},"DriftCheckLogCreate":{"properties":{"cluster_id":{"type":"string","title":"Cluster Id"},"stack_name":{"type":"string","title":"Stack Name"},"has_drift":{"type":"boolean","title":"Has Drift"},"corrected":{"type":"boolean","title":"Corrected"},"changes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Changes"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["cluster_id","stack_name","has_drift","corrected"],"title":"DriftCheckLogCreate"},"EnvVarInfo":{"properties":{"name":{"type":"string","title":"Name"},"required":{"type":"boolean","title":"Required","default":false},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"default_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Value"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},"type":"object","required":["name"],"title":"EnvVarInfo"},"EnvironmentVariable":{"properties":{"name":{"type":"string","title":"Name"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"secret_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Ref"}},"type":"object","required":["name"],"title":"EnvironmentVariable","description":"Environment variable configuration."},"ExcludedComponentsResponse":{"properties":{"management_only":{"items":{"type":"string"},"type":"array","title":"Management Only"},"host_cluster_only":{"items":{"type":"string"},"type":"array","title":"Host Cluster Only"},"all_excluded":{"items":{"type":"string"},"type":"array","title":"All Excluded"}},"type":"object","required":["management_only","host_cluster_only","all_excluded"],"title":"ExcludedComponentsResponse","description":"Components excluded from user-facing bundle views.\n\nThese components are only deployed to management or host clusters,\nnot to user clusters. Determined by ApplicationSet selector labels."},"ExecutePromotionRequest":{"properties":{"source_deployment_id":{"type":"string","format":"uuid","title":"Source Deployment Id"},"target_cluster_id":{"type":"string","format":"uuid","title":"Target Cluster Id"},"delete_source":{"type":"boolean","title":"Delete Source","default":false}},"type":"object","required":["source_deployment_id","target_cluster_id"],"title":"ExecutePromotionRequest","description":"Request to execute deployment promotion (worker calls this)."},"FeatureFlagsUpdate":{"properties":{"flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Flags"}},"type":"object","required":["flags"],"title":"FeatureFlagsUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HarborSetupRequest":{"properties":{"management_cluster_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Management Cluster Ip"}},"type":"object","title":"HarborSetupRequest"},"HealthCheckProbe":{"properties":{"enabled":{"type":"boolean","title":"Enabled","default":true},"type":{"anyOf":[{"type":"string","enum":["http","tcp"]},{"type":"null"}],"title":"Type"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"initial_delay_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":0.0},{"type":"null"}],"title":"Initial Delay Seconds"},"period_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":1.0},{"type":"null"}],"title":"Period Seconds"},"timeout_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":1.0},{"type":"null"}],"title":"Timeout Seconds"},"failure_threshold":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Failure Threshold"}},"type":"object","title":"HealthCheckProbe","description":"One container health check (liveness or readiness probe).\n\nAll fields except `enabled` are optional: an unset `type` keeps the\nauto-detected HTTP/TCP choice, an unset `path` keeps the detected\nendpoint, and unset timings keep the platform defaults."},"HealthChecksConfig":{"properties":{"liveness":{"anyOf":[{"$ref":"#/components/schemas/HealthCheckProbe"},{"type":"null"}]},"readiness":{"anyOf":[{"$ref":"#/components/schemas/HealthCheckProbe"},{"type":"null"}]},"startup":{"anyOf":[{"$ref":"#/components/schemas/HealthCheckProbe"},{"type":"null"}]}},"type":"object","title":"HealthChecksConfig","description":"Container health check configuration (stored in the deployment config).\n\nOn update, an empty object clears any overrides and restores automatic\ndetection."},"HealthcheckInfo":{"properties":{"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"},"suggested":{"type":"boolean","title":"Suggested","default":false}},"type":"object","title":"HealthcheckInfo"},"HelmChartInspectRequest":{"properties":{"repo_url":{"type":"string","title":"Repo Url"},"chart_name":{"type":"string","title":"Chart Name"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"}},"type":"object","required":["repo_url","chart_name"],"title":"HelmChartInspectRequest","description":"Request for inspecting a Helm chart."},"HelmChartOption":{"properties":{"name":{"type":"string","title":"Name"},"repository":{"type":"string","title":"Repository"},"description":{"type":"string","title":"Description"}},"type":"object","required":["name","repository","description"],"title":"HelmChartOption"},"HostClusterCreateRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"region":{"type":"string","title":"Region"}},"type":"object","required":["provider","region"],"title":"HostClusterCreateRequest"},"ImageInfo":{"properties":{"reference":{"type":"string","title":"Reference"},"is_official":{"type":"boolean","title":"Is Official","default":false},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["reference"],"title":"ImageInfo"},"ImpersonatorInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["id","email"],"title":"ImpersonatorInfo"},"InternalClusterCreate":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"region":{"type":"string","title":"Region"},"tier":{"type":"string","title":"Tier"},"geographic_region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geographic Region"},"server_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Type"},"is_management":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Management"}},"type":"object","required":["user_id","name","provider","region","tier"],"title":"InternalClusterCreate","description":"Schema for creating clusters via internal API.\n\nUsed for integration testing and service-to-service cluster creation.\nBypasses billing verification."},"InventoryNode":{"properties":{"instance_type":{"type":"string","title":"Instance Type"},"region":{"type":"string","title":"Region"},"zone":{"type":"string","title":"Zone"}},"type":"object","required":["instance_type","region","zone"],"title":"InventoryNode","description":"A provisioned cluster node, read from Kubernetes node labels."},"InvitationAcceptResponse":{"properties":{"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"},"organization_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Slug"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["organization_id","organization_slug","created"],"title":"InvitationAcceptResponse"},"InvitationPreviewResponse":{"properties":{"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"invited_email_masked":{"type":"string","title":"Invited Email Masked"},"invited_email":{"type":"string","title":"Invited Email"},"invitee_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invitee Name"},"inviter_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Inviter Name"},"trial_credit_eur":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trial Credit Eur"},"expires_at":{"type":"string","title":"Expires At"},"status":{"type":"string","title":"Status"}},"type":"object","required":["organization_name","invited_email_masked","invited_email","invitee_name","inviter_name","trial_credit_eur","expires_at","status"],"title":"InvitationPreviewResponse"},"InvoiceSettingsCreate":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name","description":"Legal company name"},"contact_email":{"type":"string","format":"email","title":"Contact Email","description":"Email address for invoices"},"address_line1":{"type":"string","maxLength":255,"minLength":1,"title":"Address Line1","description":"Street address"},"address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line2","description":"Address line 2"},"city":{"type":"string","maxLength":100,"minLength":1,"title":"City","description":"City"},"postal_code":{"type":"string","maxLength":20,"minLength":1,"title":"Postal Code","description":"Postal/ZIP code"},"country_code":{"type":"string","maxLength":2,"minLength":2,"title":"Country Code","description":"ISO 3166-1 alpha-2 country code"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number","description":"EU VAT number"}},"type":"object","required":["contact_email","address_line1","city","postal_code","country_code"],"title":"InvoiceSettingsCreate","description":"Schema for creating invoice settings."},"InvoiceSettingsResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"organization_id":{"type":"string","format":"uuid","title":"Organization Id"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"contact_email":{"type":"string","title":"Contact Email"},"address_line1":{"type":"string","title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address Line2"},"city":{"type":"string","title":"City"},"postal_code":{"type":"string","title":"Postal Code"},"country_code":{"type":"string","title":"Country Code"},"country_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Name"},"vat_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Number"},"vat_number_verified":{"type":"boolean","title":"Vat Number Verified"},"vat_number_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Vat Number Verified At"},"vat_verification_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Verification Name"},"vat_treatment":{"$ref":"#/components/schemas/VATTreatment"},"vat_treatment_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vat Treatment Description"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","organization_id","company_name","contact_email","address_line1","address_line2","city","postal_code","country_code","vat_number","vat_number_verified","vat_number_verified_at","vat_verification_name","vat_treatment","created_at","updated_at"],"title":"InvoiceSettingsResponse","description":"Schema for invoice settings response."},"InvoiceSettingsUpdate":{"properties":{"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name"},"contact_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Contact Email"},"address_line1":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Address Line1"},"address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Address Line2"},"city":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"City"},"postal_code":{"anyOf":[{"type":"string","maxLength":20,"minLength":1},{"type":"null"}],"title":"Postal Code"},"country_code":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Country Code"},"vat_number":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Vat Number"}},"type":"object","title":"InvoiceSettingsUpdate","description":"Schema for updating invoice settings (all fields optional)."},"KubernetesVersionListResponse":{"properties":{"versions":{"items":{"$ref":"#/components/schemas/KubernetesVersionResponse"},"type":"array","title":"Versions"},"default_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default Version"}},"type":"object","required":["versions"],"title":"KubernetesVersionListResponse","description":"List of Kubernetes versions for a provider."},"KubernetesVersionResponse":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"provider":{"type":"string","title":"Provider"},"cluster_type":{"type":"string","title":"Cluster Type"},"version":{"type":"string","title":"Version"},"patch_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Patch Version"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"is_default":{"type":"boolean","title":"Is Default"},"is_deprecated":{"type":"boolean","title":"Is Deprecated"},"end_of_life_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Of Life Date"},"release_notes_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Notes Url"}},"type":"object","required":["provider","cluster_type","version","is_default","is_deprecated"],"title":"KubernetesVersionResponse","description":"Response schema for a Kubernetes version."},"LiveStatusResponse":{"properties":{"deployment_id":{"type":"string","title":"Deployment Id"},"db_status":{"type":"string","title":"Db Status"},"argocd_status":{"additionalProperties":true,"type":"object","title":"Argocd Status"},"status_updated":{"type":"boolean","title":"Status Updated"},"endpoint_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint Url"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["deployment_id","db_status","argocd_status","status_updated"],"title":"LiveStatusResponse","description":"Response for live ArgoCD status check."},"LogLabelValuesResponse":{"properties":{"values":{"items":{"type":"string"},"type":"array","title":"Values"}},"type":"object","required":["values"],"title":"LogLabelValuesResponse"},"LogLabelsResponse":{"properties":{"labels":{"items":{"type":"string"},"type":"array","title":"Labels"}},"type":"object","required":["labels"],"title":"LogLabelsResponse"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LoginResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"oauth_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Provider"},"is_active":{"type":"boolean","title":"Is Active"},"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"requires_passkey_migration":{"type":"boolean","title":"Requires Passkey Migration","default":false}},"type":"object","required":["id","email","is_active","access_token"],"title":"LoginResponse","description":"Login response with user info and token."},"LogsQueryResponse":{"properties":{"status":{"type":"string","title":"Status"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["status","data"],"title":"LogsQueryResponse"},"MandateSetupRequest":{"properties":{"redirect_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Path"}},"type":"object","title":"MandateSetupRequest"},"MandateSetupResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"}},"type":"object","required":["checkout_url"],"title":"MandateSetupResponse"},"MarketingEmailRequest":{"properties":{"email_type":{"type":"string","title":"Email Type"}},"type":"object","required":["email_type"],"title":"MarketingEmailRequest"},"McpCallLogEntry":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"user_id":{"type":"string","title":"User Id"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"tool":{"type":"string","title":"Tool"},"arguments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Arguments"},"status":{"type":"string","title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"client_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ip"},"auth_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auth Method"},"oauth_client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Client Name"}},"type":"object","required":["id","created_at","user_id","user_email","tool","status"],"title":"McpCallLogEntry"},"McpCallLogList":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/McpCallLogEntry"},"type":"array","title":"Entries"},"total":{"type":"integer","title":"Total"},"total_errors":{"type":"integer","title":"Total Errors","default":0}},"type":"object","required":["entries","total"],"title":"McpCallLogList"},"McpCallRecord":{"properties":{"tool":{"type":"string","maxLength":64,"minLength":1,"title":"Tool"},"arguments":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Arguments"},"status":{"type":"string","enum":["ok","error"],"title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"duration_ms":{"anyOf":[{"type":"integer","maximum":86400000.0,"minimum":0.0},{"type":"null"}],"title":"Duration Ms"},"client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client"},"client_ip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Ip"}},"type":"object","required":["tool","status"],"title":"McpCallRecord"},"MeResponse":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"id":{"type":"string","format":"uuid","title":"Id"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"oauth_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Provider"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"deletion_requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Requested At"},"deletion_scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Scheduled For"},"feature_flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Feature Flags"},"impersonator":{"anyOf":[{"$ref":"#/components/schemas/ImpersonatorInfo"},{"type":"null"}]}},"type":"object","required":["email","id","is_active","created_at"],"title":"MeResponse"},"MetricLabelValuesResponse":{"properties":{"values":{"items":{"type":"string"},"type":"array","title":"Values"}},"type":"object","required":["values"],"title":"MetricLabelValuesResponse"},"MetricLabelsResponse":{"properties":{"labels":{"items":{"type":"string"},"type":"array","title":"Labels"}},"type":"object","required":["labels"],"title":"MetricLabelsResponse"},"MetricsQueryResponse":{"properties":{"status":{"type":"string","title":"Status"},"data":{"additionalProperties":true,"type":"object","title":"Data"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"error_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Type"}},"type":"object","required":["status","data"],"title":"MetricsQueryResponse"},"MigrationBackupInfo":{"properties":{"backup_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Size Bytes"},"pvc_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pvc Count"},"resource_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Count"}},"type":"object","title":"MigrationBackupInfo","description":"Internal (worker → backend) backup metadata."},"MigrationCreate":{"properties":{"source_cluster_id":{"type":"string","format":"uuid","title":"Source Cluster Id"},"target_cluster_id":{"type":"string","format":"uuid","title":"Target Cluster Id"},"namespace":{"type":"string","maxLength":63,"minLength":1,"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$","title":"Namespace"},"target_namespace":{"anyOf":[{"type":"string","maxLength":63,"minLength":1,"pattern":"^[a-z0-9]([-a-z0-9]*[a-z0-9])?$"},{"type":"null"}],"title":"Target Namespace"},"import_workloads":{"type":"boolean","title":"Import Workloads","default":true},"resync_interval_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resync Interval Minutes"}},"type":"object","required":["source_cluster_id","target_cluster_id","namespace"],"title":"MigrationCreate"},"MigrationListResponse":{"properties":{"migrations":{"items":{"$ref":"#/components/schemas/MigrationResponse"},"type":"array","title":"Migrations"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["migrations","total"],"title":"MigrationListResponse"},"MigrationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"source_cluster_id":{"type":"string","format":"uuid","title":"Source Cluster Id"},"target_cluster_id":{"type":"string","format":"uuid","title":"Target Cluster Id"},"namespace":{"type":"string","title":"Namespace"},"target_namespace":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Namespace"},"import_workloads":{"type":"boolean","title":"Import Workloads"},"status":{"$ref":"#/components/schemas/MigrationStatus"},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"backup_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Name"},"restore_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restore Name"},"backup_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Size Bytes"},"pvc_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pvc Count"},"resource_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Count"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"resync_interval_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resync Interval Minutes"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","user_id","source_cluster_id","target_cluster_id","namespace","import_workloads","status","created_at"],"title":"MigrationResponse"},"MigrationResyncSchedule":{"properties":{"interval_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Interval Minutes"}},"type":"object","title":"MigrationResyncSchedule","description":"Auto re-sync schedule; None disables it."},"MigrationRunListResponse":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/MigrationRunResponse"},"type":"array","title":"Runs"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["runs","total"],"title":"MigrationRunListResponse"},"MigrationRunResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"migration_id":{"type":"string","format":"uuid","title":"Migration Id"},"trigger":{"$ref":"#/components/schemas/MigrationRunTrigger"},"status":{"$ref":"#/components/schemas/MigrationStatus"},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"backup_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Name"},"restore_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restore Name"},"backup_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backup Size Bytes"},"pvc_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pvc Count"},"resource_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Resource Count"},"started_at":{"type":"string","format":"date-time","title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"}},"type":"object","required":["id","migration_id","trigger","status","started_at"],"title":"MigrationRunResponse","description":"One execution of a migration (initial run or re-sync)."},"MigrationRunTrigger":{"type":"string","enum":["initial","manual","scheduled"],"title":"MigrationRunTrigger"},"MigrationStatus":{"type":"string","enum":["pending","installing_velero_source","backing_up","installing_velero_target","restoring","importing_workloads","cleaning_up","completed","failed","cancelled"],"title":"MigrationStatus"},"MigrationStatusUpdate":{"properties":{"status":{"$ref":"#/components/schemas/MigrationStatus"},"progress_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Progress Message"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"backup_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Backup Name"},"restore_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Restore Name"}},"type":"object","required":["status"],"title":"MigrationStatusUpdate","description":"Internal (worker → backend) status update."},"NamespaceListResponse":{"properties":{"namespaces":{"items":{"type":"string"},"type":"array","title":"Namespaces"}},"type":"object","required":["namespaces"],"title":"NamespaceListResponse"},"NamespacePVCSummary":{"properties":{"name":{"type":"string","title":"Name"},"storage_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Storage Class"},"capacity_gb":{"type":"number","title":"Capacity Gb"},"access_modes":{"items":{"type":"string"},"type":"array","title":"Access Modes"},"bound":{"type":"boolean","title":"Bound"}},"type":"object","required":["name","capacity_gb","access_modes","bound"],"title":"NamespacePVCSummary"},"NamespaceSummary":{"properties":{"namespace":{"type":"string","title":"Namespace"},"workloads":{"$ref":"#/components/schemas/NamespaceWorkloadCounts"},"pvcs":{"items":{"$ref":"#/components/schemas/NamespacePVCSummary"},"type":"array","title":"Pvcs"},"total_pvc_size_gb":{"type":"number","title":"Total Pvc Size Gb"},"services":{"type":"integer","title":"Services"},"configmaps":{"type":"integer","title":"Configmaps"},"secrets":{"type":"integer","title":"Secrets"}},"type":"object","required":["namespace","workloads","pvcs","total_pvc_size_gb","services","configmaps","secrets"],"title":"NamespaceSummary"},"NamespaceWorkloadCounts":{"properties":{"deployments":{"type":"integer","title":"Deployments"},"statefulsets":{"type":"integer","title":"Statefulsets"},"daemonsets":{"type":"integer","title":"Daemonsets"}},"type":"object","required":["deployments","statefulsets","daemonsets"],"title":"NamespaceWorkloadCounts"},"NatGatewayCreate":{"properties":{"location":{"type":"string","title":"Location"}},"type":"object","required":["location"],"title":"NatGatewayCreate"},"NatGatewayProvisionedUpdate":{"properties":{"server_id":{"type":"string","title":"Server Id"},"private_ip":{"type":"string","title":"Private Ip"},"public_ip":{"type":"string","title":"Public Ip"},"pulumi_stack_name":{"type":"string","title":"Pulumi Stack Name"}},"type":"object","required":["server_id","private_ip","public_ip","pulumi_stack_name"],"title":"NatGatewayProvisionedUpdate"},"NatGatewayStatusUpdate":{"properties":{"status":{"$ref":"#/components/schemas/ZoneInfraStatus"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status"],"title":"NatGatewayStatusUpdate"},"NotificationChannelCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"type":{"$ref":"#/components/schemas/NotificationChannelType"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"is_enabled":{"type":"boolean","title":"Is Enabled","default":true}},"type":"object","required":["name","type","config"],"title":"NotificationChannelCreate"},"NotificationChannelListResponse":{"properties":{"channels":{"items":{"$ref":"#/components/schemas/NotificationChannelResponse"},"type":"array","title":"Channels"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["channels","total"],"title":"NotificationChannelListResponse"},"NotificationChannelResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"},"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/NotificationChannelType"},"is_enabled":{"type":"boolean","title":"Is Enabled"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","user_id","name","type","is_enabled","created_at","updated_at"],"title":"NotificationChannelResponse"},"NotificationChannelType":{"type":"string","enum":["email","slack","webhook","pagerduty","discord"],"title":"NotificationChannelType"},"NotificationChannelUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"is_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Enabled"}},"type":"object","title":"NotificationChannelUpdate"},"ObservabilityConfigResponse":{"properties":{"cluster_id":{"type":"string","format":"uuid","title":"Cluster Id"},"observability_enabled":{"type":"boolean","title":"Observability Enabled"},"tenant_id":{"type":"string","title":"Tenant Id"}},"type":"object","required":["cluster_id","observability_enabled","tenant_id"],"title":"ObservabilityConfigResponse"},"ObservabilityConfigUpdate":{"properties":{"observability_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Observability Enabled"}},"type":"object","title":"ObservabilityConfigUpdate"},"ObservedBackup":{"properties":{"k8s_name":{"type":"string","title":"K8S Name"},"backup_type":{"type":"string","title":"Backup Type","default":"scheduled"},"status":{"type":"string","title":"Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"s3_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"S3 Path"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"barman_backup_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barman Backup Id"},"barman_server_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Barman Server Name"}},"type":"object","required":["k8s_name","status"],"title":"ObservedBackup","description":"One operator Backup object as seen on the cluster by the worker."},"OpenBaoConfigureRequest":{"properties":{"root_token":{"type":"string","title":"Root Token"}},"type":"object","required":["root_token"],"title":"OpenBaoConfigureRequest"},"OpenBaoUnsealRequest":{"properties":{"unseal_keys":{"items":{"type":"string"},"type":"array","title":"Unseal Keys"}},"type":"object","required":["unseal_keys"],"title":"OpenBaoUnsealRequest"},"OrganizationCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"slug":{"anyOf":[{"type":"string","maxLength":100,"minLength":1,"pattern":"^[a-z0-9-]+$"},{"type":"null"}],"title":"Slug"}},"type":"object","required":["name"],"title":"OrganizationCreate"},"OrganizationDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_system":{"type":"boolean","title":"Is System"},"is_personal":{"type":"boolean","title":"Is Personal","default":false},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"member_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Count"},"current_user_role":{"anyOf":[{"$ref":"#/components/schemas/OrganizationRole"},{"type":"null"}]},"members":{"items":{"$ref":"#/components/schemas/OrganizationMemberResponse"},"type":"array","title":"Members","default":[]},"outstanding_balance":{"type":"number","title":"Outstanding Balance","default":0.0},"has_pending_payment":{"type":"boolean","title":"Has Pending Payment","default":false}},"type":"object","required":["id","name","slug","is_system","avatar_url","created_at","updated_at"],"title":"OrganizationDetailResponse"},"OrganizationListResponse":{"properties":{"organizations":{"items":{"$ref":"#/components/schemas/OrganizationResponse"},"type":"array","title":"Organizations"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["organizations","total"],"title":"OrganizationListResponse"},"OrganizationMemberCreate":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"role":{"$ref":"#/components/schemas/OrganizationRole","default":"member"}},"type":"object","required":["user_id"],"title":"OrganizationMemberCreate"},"OrganizationMemberInvite":{"properties":{"email":{"type":"string","maxLength":255,"minLength":1,"title":"Email"},"role":{"$ref":"#/components/schemas/OrganizationRole","default":"member"}},"type":"object","required":["email"],"title":"OrganizationMemberInvite"},"OrganizationMemberResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"organization_id":{"type":"string","format":"uuid","title":"Organization Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"role":{"$ref":"#/components/schemas/OrganizationRole"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"},"user_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Name"},"user_avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Avatar Url"}},"type":"object","required":["id","organization_id","user_id","role","created_at"],"title":"OrganizationMemberResponse"},"OrganizationMemberUpdate":{"properties":{"role":{"$ref":"#/components/schemas/OrganizationRole"}},"type":"object","required":["role"],"title":"OrganizationMemberUpdate"},"OrganizationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"is_system":{"type":"boolean","title":"Is System"},"is_personal":{"type":"boolean","title":"Is Personal","default":false},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"member_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member Count"},"current_user_role":{"anyOf":[{"$ref":"#/components/schemas/OrganizationRole"},{"type":"null"}]}},"type":"object","required":["id","name","slug","is_system","avatar_url","created_at","updated_at"],"title":"OrganizationResponse"},"OrganizationRole":{"type":"string","enum":["owner","admin","member"],"title":"OrganizationRole"},"OrganizationUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Avatar Url"}},"type":"object","title":"OrganizationUpdate"},"PasskeyAddVerifyRequest":{"properties":{"credential":{"additionalProperties":true,"type":"object","title":"Credential"},"passkey_name":{"type":"string","title":"Passkey Name","default":"My Passkey"}},"type":"object","required":["credential"],"title":"PasskeyAddVerifyRequest"},"PasskeyLoginOptionsRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"PasskeyLoginOptionsRequest"},"PasskeyLoginVerifyRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"credential":{"additionalProperties":true,"type":"object","title":"Credential"}},"type":"object","required":["email","credential"],"title":"PasskeyLoginVerifyRequest"},"PasskeyMigrateVerifyRequest":{"properties":{"credential":{"additionalProperties":true,"type":"object","title":"Credential"},"passkey_name":{"type":"string","title":"Passkey Name","default":"My Passkey"}},"type":"object","required":["credential"],"title":"PasskeyMigrateVerifyRequest"},"PasskeyRegistrationOptionsRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","minLength":1,"title":"Name"}},"type":"object","required":["email","name"],"title":"PasskeyRegistrationOptionsRequest"},"PasskeyRegistrationVerifyRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"type":"string","minLength":1,"title":"Name"},"credential":{"additionalProperties":true,"type":"object","title":"Credential"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"}},"type":"object","required":["email","name","credential"],"title":"PasskeyRegistrationVerifyRequest"},"PasskeyRenameRequest":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"}},"type":"object","required":["name"],"title":"PasskeyRenameRequest"},"PlanType":{"type":"string","enum":["free"],"title":"PlanType"},"PortInfo":{"properties":{"port":{"type":"integer","title":"Port"},"protocol":{"type":"string","title":"Protocol","default":"tcp"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["port"],"title":"PortInfo"},"PortalSessionResponse":{"properties":{"portal_url":{"type":"string","title":"Portal Url"}},"type":"object","required":["portal_url"],"title":"PortalSessionResponse"},"PreflightConflict":{"properties":{"resource_type":{"type":"string","title":"Resource Type"},"name":{"type":"string","title":"Name"},"severity":{"type":"string","title":"Severity"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["resource_type","name","severity","detail"],"title":"PreflightConflict","description":"A single collision detected by import preflight."},"PreflightImportRequest":{"properties":{"kubeconfig":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubeconfig"},"cloud_credential_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cloud Credential Id"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"provider_cluster_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Cluster Id"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},"type":"object","title":"PreflightImportRequest","description":"Input to POST /clusters/preflight-import.\n\nEither ``kubeconfig`` or (``cloud_credential_id`` + ``provider`` +\n``provider_cluster_id``) must be supplied — same contract as the\nregular import endpoint."},"PreflightImportResponse":{"properties":{"safe_to_import":{"type":"boolean","title":"Safe To Import"},"conflicts":{"items":{"$ref":"#/components/schemas/PreflightConflict"},"type":"array","title":"Conflicts"},"worker_node_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Worker Node Count"},"detected_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detected Tier"}},"type":"object","required":["safe_to_import","conflicts"],"title":"PreflightImportResponse","description":"Result of POST /clusters/preflight-import."},"ProviderRegionUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"disabled_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disabled Reason"}},"type":"object","required":["enabled"],"title":"ProviderRegionUpdate"},"ProvisionManagementClusterRequest":{"properties":{"name":{"type":"string","title":"Name","default":"mengi-management"},"tier":{"type":"string","title":"Tier","default":"production"},"provider":{"type":"string","title":"Provider","default":"hetzner"},"region":{"type":"string","title":"Region","default":"nbg1"},"server_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Server Type"},"kubernetes_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kubernetes Version"}},"type":"object","title":"ProvisionManagementClusterRequest","description":"Request to provision the management cluster.\n\nUses the same parameters as normal cluster creation for consistency."},"RegionLocationsUpdate":{"properties":{"region_locations":{"items":{"type":"string"},"type":"array","maxItems":3,"minItems":1,"title":"Region Locations"}},"type":"object","required":["region_locations"],"title":"RegionLocationsUpdate","description":"Schema for updating multi-region locations on a Hetzner production cluster."},"RegistrationStatusUpdate":{"properties":{"registration_status":{"type":"string","title":"Registration Status"},"argocd_cluster_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Argocd Cluster Name"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["registration_status"],"title":"RegistrationStatusUpdate"},"RegistryCredentialCreatedResponse":{"properties":{"id":{"type":"string","title":"Id"},"registry_url":{"type":"string","title":"Registry Url"},"repository_prefix":{"type":"string","title":"Repository Prefix"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"docker_login_command":{"type":"string","title":"Docker Login Command"},"helm_login_command":{"type":"string","title":"Helm Login Command"},"chart_push_url":{"type":"string","title":"Chart Push Url"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","registry_url","repository_prefix","username","password","docker_login_command","helm_login_command","chart_push_url","is_active","created_at"],"title":"RegistryCredentialCreatedResponse","description":"Response when credential is created (includes password once)."},"RegistryCredentialResponse":{"properties":{"id":{"type":"string","title":"Id"},"registry_url":{"type":"string","title":"Registry Url"},"repository_prefix":{"type":"string","title":"Repository Prefix"},"username":{"type":"string","title":"Username"},"docker_login_command":{"type":"string","title":"Docker Login Command"},"helm_login_command":{"type":"string","title":"Helm Login Command"},"chart_push_url":{"type":"string","title":"Chart Push Url"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","registry_url","repository_prefix","username","docker_login_command","helm_login_command","chart_push_url","is_active","created_at"],"title":"RegistryCredentialResponse","description":"Response for registry credential (without password)."},"RegistryCredentialStatus":{"properties":{"has_credentials":{"type":"boolean","title":"Has Credentials"},"credentials":{"anyOf":[{"$ref":"#/components/schemas/RegistryCredentialResponse"},{"type":"null"}]}},"type":"object","required":["has_credentials"],"title":"RegistryCredentialStatus","description":"Simple status response."},"RegistryRepositoryResponse":{"properties":{"name":{"type":"string","title":"Name"},"full_name":{"type":"string","title":"Full Name"},"artifact_count":{"type":"integer","title":"Artifact Count"},"pull_count":{"type":"integer","title":"Pull Count"},"artifact_type":{"type":"string","title":"Artifact Type","default":"unknown"}},"type":"object","required":["name","full_name","artifact_count","pull_count"],"title":"RegistryRepositoryResponse","description":"A repository in the user's Harbor project."},"RegistryTagResponse":{"properties":{"name":{"type":"string","title":"Name"},"push_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Push Time"},"full_reference":{"type":"string","title":"Full Reference"},"artifact_type":{"type":"string","title":"Artifact Type","default":"image"}},"type":"object","required":["name","full_reference"],"title":"RegistryTagResponse","description":"A tag on an artifact in a Harbor repository."},"ReplicationGroupCreate":{"properties":{"name":{"type":"string","title":"Name"},"engine":{"$ref":"#/components/schemas/DatabaseEngine"},"cluster_ids":{"items":{"type":"string","format":"uuid"},"type":"array","title":"Cluster Ids"},"database_config":{"$ref":"#/components/schemas/DatabaseCreate"}},"type":"object","required":["name","engine","cluster_ids","database_config"],"title":"ReplicationGroupCreate"},"ReplicationGroupListResponse":{"properties":{"groups":{"items":{"$ref":"#/components/schemas/ReplicationGroupResponse"},"type":"array","title":"Groups"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["groups","total"],"title":"ReplicationGroupListResponse"},"ReplicationGroupResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"engine":{"$ref":"#/components/schemas/DatabaseEngine"},"primary_instance_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Primary Instance Id"},"instances":{"items":{"$ref":"#/components/schemas/DatabaseResponse"},"type":"array","title":"Instances"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","engine","instances","created_at","updated_at"],"title":"ReplicationGroupResponse"},"ReplicationHostUpdate":{"properties":{"replication_host":{"type":"string","title":"Replication Host"}},"type":"object","required":["replication_host"],"title":"ReplicationHostUpdate"},"RequiredBucketInfo":{"properties":{"name":{"type":"string","title":"Name"},"purpose":{"type":"string","title":"Purpose"},"description":{"type":"string","title":"Description"},"exists":{"type":"boolean","title":"Exists"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["name","purpose","description","exists"],"title":"RequiredBucketInfo","description":"Information about a required system storage bucket."},"RequiredBucketsResponse":{"properties":{"production":{"items":{"$ref":"#/components/schemas/RequiredBucketInfo"},"type":"array","title":"Production"},"development":{"items":{"$ref":"#/components/schemas/RequiredBucketInfo"},"type":"array","title":"Development"},"production_missing_count":{"type":"integer","title":"Production Missing Count"},"development_missing_count":{"type":"integer","title":"Development Missing Count"},"has_credentials":{"type":"boolean","title":"Has Credentials"}},"type":"object","required":["production","development","production_missing_count","development_missing_count","has_credentials"],"title":"RequiredBucketsResponse","description":"Response for required storage buckets status check."},"ResourceAmountResponse":{"properties":{"cpu_millicores":{"type":"integer","title":"Cpu Millicores"},"memory_mb":{"type":"integer","title":"Memory Mb"}},"type":"object","required":["cpu_millicores","memory_mb"],"title":"ResourceAmountResponse"},"ResourceRequirements":{"properties":{"requests":{"$ref":"#/components/schemas/ResourceSpec"},"limits":{"$ref":"#/components/schemas/ResourceSpec"}},"type":"object","required":["requests","limits"],"title":"ResourceRequirements"},"ResourceSpec":{"properties":{"cpu":{"type":"string","title":"Cpu"},"memory":{"type":"string","title":"Memory"}},"type":"object","required":["cpu","memory"],"title":"ResourceSpec"},"RestoreRequest":{"properties":{"backup_id":{"type":"string","format":"uuid","title":"Backup Id"}},"type":"object","required":["backup_id"],"title":"RestoreRequest"},"RevenueReportResponse":{"properties":{"customers":{"items":{"$ref":"#/components/schemas/CustomerRevenueResponse"},"type":"array","title":"Customers"},"month_total":{"type":"number","title":"Month Total"},"year_total":{"type":"number","title":"Year Total"},"all_time_total":{"type":"number","title":"All Time Total"},"period_month":{"type":"string","title":"Period Month"},"period_year":{"type":"integer","title":"Period Year"}},"type":"object","required":["customers","month_total","year_total","all_time_total","period_month","period_year"],"title":"RevenueReportResponse"},"SecretCreate":{"properties":{"name":{"type":"string","title":"Name"},"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"generate":{"type":"boolean","title":"Generate","default":false},"deployment_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Deployment Id"},"organization_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Organization Id"}},"type":"object","required":["name"],"title":"SecretCreate"},"SecretListResponse":{"properties":{"secrets":{"items":{"$ref":"#/components/schemas/SecretResponse"},"type":"array","title":"Secrets"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["secrets","total"],"title":"SecretListResponse"},"SecretResponse":{"properties":{"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key"},"deployment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"},"database_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Database Id"},"organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Id"}},"type":"object","required":["name","key"],"title":"SecretResponse"},"SecretTransferRequest":{"properties":{"target_organization_id":{"type":"string","format":"uuid","title":"Target Organization Id"}},"type":"object","required":["target_organization_id"],"title":"SecretTransferRequest"},"SecretUpdate":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"generate":{"type":"boolean","title":"Generate","default":false}},"type":"object","title":"SecretUpdate"},"SecretValueResponse":{"properties":{"name":{"type":"string","title":"Name"},"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"deployment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deployment Id"}},"type":"object","required":["name","key","value"],"title":"SecretValueResponse"},"ServerTypeUpdate":{"properties":{"server_type":{"type":"string","maxLength":50,"minLength":1,"title":"Server Type"}},"type":"object","required":["server_type"],"title":"ServerTypeUpdate","description":"Schema for changing a cluster's node machine (server) type in place.\n\nTriggers a Pulumi node-pool replacement to the new type; the cluster\nand its persistent volumes survive. Distinct from `tier`, which is\nimmutable."},"ServiceRecommendation":{"properties":{"service_type":{"type":"string","title":"Service Type"},"service_name":{"type":"string","title":"Service Name"},"detected_from":{"type":"string","title":"Detected From"},"helm_chart":{"$ref":"#/components/schemas/HelmChartOption"}},"type":"object","required":["service_type","service_name","detected_from","helm_chart"],"title":"ServiceRecommendation"},"SetClusterDNSCredential":{"properties":{"dns_credential_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Dns Credential Id"}},"type":"object","title":"SetClusterDNSCredential"},"SilenceCreate":{"properties":{"duration_minutes":{"type":"integer","maximum":525600.0,"minimum":1.0,"title":"Duration Minutes"},"comment":{"type":"string","maxLength":500,"minLength":1,"title":"Comment"}},"type":"object","required":["duration_minutes","comment"],"title":"SilenceCreate"},"SilenceListResponse":{"properties":{"silences":{"items":{"$ref":"#/components/schemas/SilenceResponse"},"type":"array","title":"Silences"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["silences","total"],"title":"SilenceListResponse"},"SilenceResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"additionalProperties":true,"type":"object","title":"Status"},"matchers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Matchers"},"starts_at":{"type":"string","title":"Starts At"},"ends_at":{"type":"string","title":"Ends At"},"created_by":{"type":"string","title":"Created By"},"comment":{"type":"string","title":"Comment"}},"type":"object","required":["id","status","matchers","starts_at","ends_at","created_by","comment"],"title":"SilenceResponse"},"SubscriptionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"plan":{"$ref":"#/components/schemas/PlanType"},"status":{"$ref":"#/components/schemas/SubscriptionStatus"},"billing_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Mode","default":"threshold"},"current_period_start":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period Start"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"next_billing_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Billing Date"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","plan","status","created_at"],"title":"SubscriptionResponse"},"SubscriptionStatus":{"type":"string","enum":["active","past_due","canceled","trialing","incomplete","suspended","pending_deletion"],"title":"SubscriptionStatus"},"SuggestedService":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"detected_from":{"type":"string","title":"Detected From"}},"type":"object","required":["id","name","type","detected_from"],"title":"SuggestedService"},"SupportedCurrency":{"type":"string","enum":["EUR","USD"],"title":"SupportedCurrency"},"SyncDeploymentRequest":{"properties":{"values_yaml":{"type":"string","title":"Values Yaml"}},"type":"object","required":["values_yaml"],"title":"SyncDeploymentRequest","description":"Request to sync deployment to Git (worker calls this)."},"TransferResourceRequest":{"properties":{"resource_type":{"type":"string","pattern":"^(cluster|deployment|secret|database|cloud_credential|dns_credential)$","title":"Resource Type"},"resource_id":{"type":"string","format":"uuid","title":"Resource Id"}},"type":"object","required":["resource_type","resource_id"],"title":"TransferResourceRequest"},"TwelveFactorAnalysis":{"properties":{"compliant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Compliant"},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"findings":{"items":{"$ref":"#/components/schemas/TwelveFactorFinding"},"type":"array","title":"Findings","default":[]}},"type":"object","title":"TwelveFactorAnalysis"},"TwelveFactorFinding":{"properties":{"factor":{"type":"string","title":"Factor"},"status":{"type":"string","title":"Status"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["factor","status"],"title":"TwelveFactorFinding"},"UpgradeAvailableResponse":{"properties":{"upgrade_available":{"type":"boolean","title":"Upgrade Available"},"current_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Version"},"available_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Available Version"},"versions_available":{"items":{"type":"string"},"type":"array","title":"Versions Available","default":[]},"available_versions":{"items":{"$ref":"#/components/schemas/KubernetesVersionResponse"},"type":"array","title":"Available Versions","default":[]}},"type":"object","required":["upgrade_available"],"title":"UpgradeAvailableResponse","description":"Response indicating if an upgrade is available."},"UpgradeRequestCreate":{"properties":{"to_version":{"type":"string","title":"To Version"},"upgrade_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Notes"}},"type":"object","required":["to_version"],"title":"UpgradeRequestCreate","description":"Request to upgrade a cluster's Kubernetes version."},"UpgradeRequestResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"cluster_id":{"type":"string","format":"uuid","title":"Cluster Id"},"from_version":{"type":"string","title":"From Version"},"to_version":{"type":"string","title":"To Version"},"status":{"type":"string","title":"Status"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"approved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Approved At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"upgrade_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Upgrade Notes"},"scheduled_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Scheduled Date"},"is_auto_scheduled":{"type":"boolean","title":"Is Auto Scheduled","default":false}},"type":"object","required":["id","cluster_id","from_version","to_version","status","requested_at"],"title":"UpgradeRequestResponse","description":"Response schema for an upgrade request."},"UpgradeRequestStatusUpdate":{"properties":{"status":{"type":"string","title":"Status"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status"],"title":"UpgradeRequestStatusUpdate","description":"Update upgrade request status."},"UploadImageResponse":{"properties":{"url":{"type":"string","title":"Url"}},"type":"object","required":["url"],"title":"UploadImageResponse"},"UserResponse":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"id":{"type":"string","format":"uuid","title":"Id"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"oauth_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Oauth Provider"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"deletion_requested_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Requested At"},"deletion_scheduled_for":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Deletion Scheduled For"},"feature_flags":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Feature Flags"}},"type":"object","required":["email","id","is_active","created_at"],"title":"UserResponse"},"UserUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","title":"UserUpdate"},"VATTreatment":{"type":"string","enum":["domestic","eu_b2b_reverse_charge","eu_b2c","export"],"title":"VATTreatment","description":"VAT treatment type for API responses."},"VATValidationRequest":{"properties":{"vat_number":{"type":"string","maxLength":50,"minLength":4,"title":"Vat Number","description":"EU VAT number to validate"}},"type":"object","required":["vat_number"],"title":"VATValidationRequest","description":"Schema for VAT number validation request."},"VATValidationResponse":{"properties":{"valid":{"type":"boolean","title":"Valid","description":"Whether the VAT number is valid"},"vat_number":{"type":"string","title":"Vat Number","description":"Normalized VAT number"},"country_code":{"type":"string","title":"Country Code","description":"Country code extracted from VAT number"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name from VIES (if available)"},"company_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Address","description":"Company address from VIES (if available)"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if validation failed"}},"type":"object","required":["valid","vat_number","country_code"],"title":"VATValidationResponse","description":"Schema for VAT number validation response."},"VClusterInfoUpdate":{"properties":{"host_cluster_id":{"type":"string","title":"Host Cluster Id"},"vcluster_namespace":{"type":"string","title":"Vcluster Namespace"},"vcluster_release_name":{"type":"string","title":"Vcluster Release Name"}},"type":"object","required":["host_cluster_id","vcluster_namespace","vcluster_release_name"],"title":"VClusterInfoUpdate"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VersionDiscoveryData":{"properties":{"provider":{"type":"string","title":"Provider"},"cluster_type":{"type":"string","title":"Cluster Type"},"version":{"type":"string","title":"Version"},"patch_version":{"type":"string","title":"Patch Version"},"is_new_default":{"type":"boolean","title":"Is New Default","default":false},"release_notes_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Release Notes Url"}},"type":"object","required":["provider","cluster_type","version","patch_version"],"title":"VersionDiscoveryData","description":"Data for recording a discovered Kubernetes version."},"VolumeConfig":{"properties":{"path":{"type":"string","title":"Path"},"sizeGb":{"type":"integer","title":"Sizegb","default":10},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purpose"}},"type":"object","required":["path"],"title":"VolumeConfig","description":"Volume configuration for persistent storage."},"VolumeInfo":{"properties":{"path":{"type":"string","title":"Path"},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purpose"},"required":{"type":"boolean","title":"Required","default":false}},"type":"object","required":["path"],"title":"VolumeInfo"},"WorkloadImportItem":{"properties":{"name":{"type":"string","title":"Name"},"namespace":{"type":"string","title":"Namespace"},"kind":{"type":"string","title":"Kind"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"app_type":{"$ref":"#/components/schemas/AppType","default":"container"},"docker_image":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Docker Image"},"helm_chart_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Name"},"helm_chart_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Chart Version"},"helm_repo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Helm Repo Url"},"custom_values_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Values Yaml"},"cpu_request":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cpu Request"},"memory_request_mb":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Memory Request Mb"},"replicas":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Replicas"},"container_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Container Port"},"command":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Command"},"args":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Args"},"service_account_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service Account Name"},"selector_match_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Selector Match Labels"},"pod_template_labels":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Pod Template Labels"},"manifest_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Manifest Yaml"},"extra_pod_spec_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Pod Spec Yaml"},"extra_container_spec_yaml":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Extra Container Spec Yaml"}},"type":"object","required":["name","namespace","kind"],"title":"WorkloadImportItem","description":"A single workload to import into Mengi."},"WorkloadImportRequest":{"properties":{"workloads":{"items":{"$ref":"#/components/schemas/WorkloadImportItem"},"type":"array","title":"Workloads"}},"type":"object","required":["workloads"],"title":"WorkloadImportRequest"},"WorkloadImportResponse":{"properties":{"imported":{"items":{"$ref":"#/components/schemas/DeploymentResponse"},"type":"array","title":"Imported"},"failed":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Failed"},"total_imported":{"type":"integer","title":"Total Imported"},"total_failed":{"type":"integer","title":"Total Failed"}},"type":"object","required":["imported","failed","total_imported","total_failed"],"title":"WorkloadImportResponse"},"ZoneInfraCreate":{"properties":{"provider":{"type":"string","title":"Provider"},"network_zone":{"type":"string","title":"Network Zone"}},"type":"object","required":["provider","network_zone"],"title":"ZoneInfraCreate"},"ZoneInfraProvisionedUpdate":{"properties":{"network_id":{"type":"string","title":"Network Id"},"api_lb_id":{"type":"string","title":"Api Lb Id"},"api_lb_ipv4":{"type":"string","title":"Api Lb Ipv4"},"api_lb_location":{"type":"string","title":"Api Lb Location"},"pulumi_stack_name":{"type":"string","title":"Pulumi Stack Name"}},"type":"object","required":["network_id","api_lb_id","api_lb_ipv4","api_lb_location","pulumi_stack_name"],"title":"ZoneInfraProvisionedUpdate"},"ZoneInfraStatus":{"type":"string","enum":["pending","provisioning","running","error"],"title":"ZoneInfraStatus"},"ZoneInfraStatusUpdate":{"properties":{"status":{"$ref":"#/components/schemas/ZoneInfraStatus"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"}},"type":"object","required":["status"],"title":"ZoneInfraStatusUpdate"}}}}