POST
Promote Canary

Authorizations

Authorization
string
header
required

Interactive user session: the login JWT, sent as Authorization: Bearer <token>.

Path Parameters

key
string
required

Response

Successful Response

One plane's card for the SA GPU screen.

key
string
required
name
string
required
type
string
required
gpu_type
string
required
enabled
boolean
required
status
string
required
est_hourly_cost
number
required
capacity_per_pod
integer
required
datacenter
string | null
live_url
string | null
est_hourly_cost_source
string
default:registry_estimate
error
string | null
desired_count
integer
default:1
auto_scale
boolean
default:false
pods
PodInfo · object[]
canary
CanaryStatusView · object | null

The plane's active canary (Phase H6), or absent when none is configured. version is the OPERATOR'S label tying the rollout to the model/adapter they just trained (it must match the model_version the canary pod was launched with); pods/healthy count the plane's pods at that version.

workers_min
integer | null
workers_max
integer | null
co_hosted_on
string | null
pod_image
string | null
blockers
ServingBlockerView · object[]
bake
BakeStatusView · object | null

The pod's baked-store freshness verdict (services/voice-engine/scripts/bake_manifest.py).

A baked image pins its model set at BUILD time and the warm-store skip deliberately declines to re-sync it, so a pod can serve last week's weights indefinitely with no symptom but behaviour. status is fresh | stale | unknown (the bucket could not be listed — never guessed).

pinned_datacenter
string | null
pinned_gpu_type
string | null
pinned_gpu_forced
boolean
default:false
hardware_source
string
default:auto
hardware_pinned_at
string<date-time> | null
hardware_drift
string | null
hardware_warning
string | null
direct_url
string | null
direct_url_in_use
boolean
default:false

Whether live traffic is actually being ROUTED at the direct address (VOICE_POD_DIRECT_URL). Knowing the address and using it are different facts, and this one is OFF by default on purpose. A RunPod direct TCP port is PLAINTEXT — the engine terminates no TLS, so the hop is plain HTTP across the public internet — and the bearer sent on it is the RunPod ACCOUNT api key, which creates and terminates pods and whose GET /v1/pods returns every pod's env including the workers' S3 credentials. Turning this on leaks that key, and the call audio and transcripts beside it, to any observer on the path, ~3 times per conversational turn. PREREQUISITES before it may carry live traffic: (1) the hop is encrypted — the engine terminating TLS on the direct port, or a mutually-authenticated tunnel (WireGuard/Tailscale) between the api task and the pod; and (2) the bearer is a NARROW, pod-scoped token instead of the account key. Neither is in place today. Read pod_pool.prefer_direct_pod_urls before flipping it; use pod_rtt_probe compare to measure without routing anything.