{"openapi":"3.0.3","info":{"title":"C3 — Cloud Control Center API","version":"3.0.0","description":"Unified API for cloud infrastructure management. Replaces the Rust API."},"components":{"schemas":{}},"paths":{"/services":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/services/{service}":{"get":{"tags":["Inventory"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/services/{service}/spec":{"get":{"tags":["Inventory"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/services/all/specs":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/topology":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/topology/drift":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/configs":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/deps":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/deps/node":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/deps/node/merged":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/deps/front":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/dns-services":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/caddy-routes":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/authelia-acl":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/monitoring-targets":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/firewall-rules":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/backup-targets":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/wireguard-peers":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/ntfy-acl":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/cloudflare-dns":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/matomo-sites":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/container-resources":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/log-routing":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/gha-config":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/home-manager":{"get":{"tags":["Inventory"],"responses":{"200":{"description":"Default Response"}}}},"/files/config/{service}":{"get":{"tags":["Inventory"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/files/config/{service}/{file}":{"get":{"tags":["Inventory"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true},{"schema":{"type":"string"},"in":"path","name":"file","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/start":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/stop":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/reset":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/containers/{name}/start":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/containers/{name}/stop":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/containers/{name}/restart":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true},{"schema":{"type":"string"},"in":"path","name":"name","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/services/{service}/start":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true},{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/vms/{vmId}/services/{service}/stop":{"post":{"tags":["Operations"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true},{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/ops/push-event":{"post":{"tags":["Operations"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ref":{"type":"string"},"repo":{"type":"string"},"sender":{"type":"string"},"head_commit":{"type":"object"},"commits":{"type":"array"},"modified_files":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Default Response"}}}},"/health":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/declared":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/deployed":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/deployed/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/health/drift":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/status":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/status/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/health/tier1":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/tier1/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/health/tier2":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/tier2/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/health/tier3":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/health/tier3/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/up/{target}":{"get":{"summary":"Quick TCP check — is the target up? (VM, service, or container)","tags":["Observability"],"description":"Fast check: VM=ssh-keyscan, service=VM reachable+containers running, container=docker state","parameters":[{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/health/{target}":{"get":{"summary":"Full health check — SSH + docker health (VM, service, or container)","tags":["Observability"],"description":"Deep check: VM=full SSH auth, service=SSH+docker inspect health, container=docker health status","parameters":[{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/reach/{target}":{"get":{"summary":"Route reachability — probe HTTPS/HTTP/TCP through Caddy","tags":["Observability"],"description":"Tests actual route: looks up service domain from topology, probes HTTPS → HTTP → TCP. Verifies the full path (Cloudflare → Caddy → service) is working.","parameters":[{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/profiling/{container}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"container","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/profiling/vm/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/tests/run/{suite}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"suite","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/tests/run/{suite}/{target}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"suite","required":true},{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/tests/connectivity":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/tests/dns":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/tests/tls":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/tests/routes":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/tests/containers":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/tests/wireguard":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/tests/full":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/workflows":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/workflows/dagu":{"get":{"tags":["Observability"],"responses":{"200":{"description":"Default Response"}}}},"/files/logs/{vmId}/{container}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true},{"schema":{"type":"string"},"in":"path","name":"container","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/files/status/{vmId}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"vmId","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/files/report/{type}":{"get":{"tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"type","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/notify/send":{"post":{"summary":"Send a push notification","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"message":{"type":"string"},"priority":{"type":"string","enum":["min","low","default","high","urgent"]},"tags":{"type":"array","items":{"type":"string"}}},"required":["title","message"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/notify/health/down":{"post":{"summary":"Alert for VM/service down","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string"},"details":{"type":"string"}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/notify/health/recovered":{"post":{"summary":"Alert for VM/service recovery","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"target":{"type":"string"}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/notify/cert/expiring":{"post":{"summary":"Alert for expiring TLS certificate","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"domain":{"type":"string"},"daysRemaining":{"type":"number"}},"required":["domain","daysRemaining"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/notify/disk/full":{"post":{"summary":"Alert for disk space warning","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"vm":{"type":"string"},"percent":{"type":"string"}},"required":["vm","percent"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/db/health/history":{"get":{"summary":"Get health check history for a VM","tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"vm","required":true},{"schema":{"type":"number"},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array"}}}}}}},"/db/uptime/report":{"get":{"summary":"Get uptime statistics for a VM","tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"vm","required":true},{"schema":{"type":"number"},"in":"query","name":"days","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/db/audit":{"get":{"summary":"Get audit log entries","tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"tool","required":false},{"schema":{"type":"string"},"in":"query","name":"target","required":false},{"schema":{"type":"number"},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array"}}}}}}},"/db/deploy/history":{"get":{"summary":"Get deployment history","tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"service","required":false},{"schema":{"type":"number"},"in":"query","name":"limit","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"array"}}}}}}},"/db/alert/state":{"get":{"summary":"Get current alert state","tags":["Observability"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"vm","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","nullable":true}}}}}}},"/db/alert/update":{"post":{"summary":"Update alert state","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"vm":{"type":"string"},"status":{"type":"string"},"notified":{"type":"boolean"}},"required":["vm","status","notified"],"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/db/prune":{"post":{"summary":"Remove old records from database","tags":["Observability"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"number"}},"additionalProperties":false}}}},"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/v2/up/{target}":{"get":{"summary":"Fast UP check (TCP+HTTP+ping+docker)","tags":["Observability v2"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v2/up/all-services":{"get":{"summary":"UP check all services in parallel","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/v2/up/all-containers":{"get":{"summary":"UP check all containers in parallel","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/v2/health/{target}":{"get":{"summary":"Health check with auto-profiling on failure","tags":["Observability v2"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v2/health/all-services":{"get":{"summary":"Health check all services","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/v2/profiling/{target}":{"get":{"summary":"Deep 4-engine profiling","tags":["Observability v2"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v2/profiling/all-services":{"get":{"summary":"Profile all services","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/v2/profiling/all-containers":{"get":{"summary":"Profile all containers","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/v2/cache":{"get":{"summary":"List cached results","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/v2/cache/{endpoint}/{target}":{"get":{"summary":"Get cached results for endpoint+target","tags":["Observability v2"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"endpoint","required":true},{"schema":{"type":"string"},"in":"path","name":"target","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/v2/cache/prune":{"post":{"summary":"Prune cached files older than 7 days","tags":["Observability v2"],"responses":{"200":{"description":"Default Response"}}}},"/security/scan":{"get":{"summary":"Full security scan across VMs","tags":["Security"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"vm","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/security/docker":{"get":{"summary":"Docker-specific security checks","tags":["Security"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"vm","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/security/ssh":{"get":{"summary":"SSH key permissions and config check","tags":["Security"],"parameters":[{"schema":{"type":"string"},"in":"query","name":"vm","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/security/tokens":{"get":{"summary":"Check for exposed secrets/tokens in containers","tags":["Security"],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/cloud-data/topology/security":{"get":{"tags":["Security"],"responses":{"200":{"description":"Default Response"}}}},"/cloud-data/topology/network":{"get":{"summary":"Docker networks and container isolation per VM","tags":["Security"],"responses":{"200":{"description":"Default Response"}}}},"/security/wireguard":{"get":{"summary":"WireGuard peer status across all VMs","tags":["Security"],"responses":{"200":{"description":"Default Response"}}}},"/files/secrets/{service}":{"get":{"tags":["Security"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"service","required":true}],"responses":{"200":{"description":"Default Response"}}}},"/cloud/oci/instances":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}},"/cloud/gcp/instances":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}},"/cloud/oci/resources":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}},"/cloud/gcp/resources":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}},"/cloud/oci/costs":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}},"/cloud/gcp/costs":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}},"/cloud/summary":{"get":{"tags":["FinOps"],"responses":{"200":{"description":"Default Response"}}}}},"tags":[{"name":"Inventory","description":"Service catalog, topology, config, and discovery"},{"name":"Delivery","description":"Build, deploy, and CI/CD pipeline"},{"name":"Operations","description":"VM, container, and service lifecycle control"},{"name":"Observability","description":"Health, profiling, diagnostics, testing, and alerting"},{"name":"Security","description":"Security scanning, auditing, and compliance"},{"name":"FinOps","description":"Cloud provider operations and cost tracking"}]}