Skip to content

Boot-progress / startup-phase probe.

GET
/startupz
Code sample: Shell / cURL
curl --request GET \
--url https://stratum.example.com/startupz

Reports where the control plane is in its startup sequence, so a boot that hangs mid-init is visible. The full API server (and /healthz) only binds at the END of a long init, so an early listener serves this endpoint DURING startup: an operator can poll it to see which phase the boot is stuck on (currentPhase + currentPhaseElapsedMs climb on a hang).

Returns 503 with state=“starting” while still booting (the body still names the current phase), 200 with state=“ready” once serving. The full server also serves it after startup so the boot timeline (phases + readyAfterMs) stays queryable.

Per-node: each control plane reports its OWN boot. The HA status rollup (GET /v1/ha/status) aggregates this across nodes.

Boot complete — control plane is serving.

Media typeapplication/json

Control-plane boot-progress report. Reports the current startup phase + per-phase timings so a stuck boot is visible.

object
state
required

“starting” until init completes, then “ready”.

string
Allowed values: starting ready
currentPhase

The in-flight phase (e.g. postgres-wait, migrations, postgres-pool, openbao, seeding). Empty once ready.

string
currentPhaseElapsedMs

How long the current phase has run — climbs on a hang.

integer format: int64
uptimeMs
required

Wall-clock since process start.

integer format: int64
readyAfterMs

Total boot time, set once ready.

integer format: int64
phases
required

Ordered phase history (completed + the in-flight one).

Array<object>
object
name
required
string
startedAt
required
string format: date-time
endedAt

Absent while the phase is in flight.

string format: date-time
durationMs
required

0 while in flight.

integer format: int64

Example

{
"state": "starting",
"currentPhase": "migrations",
"phases": [
{
"name": "migrations"
}
]
}

Still booting — body names the current phase. Same shape as the 200, returned with the problem content-type (used for non-Problem structured results, as /dataplane does).

Media typeapplication/problem+json

Control-plane boot-progress report. Reports the current startup phase + per-phase timings so a stuck boot is visible.

object
state
required

“starting” until init completes, then “ready”.

string
Allowed values: starting ready
currentPhase

The in-flight phase (e.g. postgres-wait, migrations, postgres-pool, openbao, seeding). Empty once ready.

string
currentPhaseElapsedMs

How long the current phase has run — climbs on a hang.

integer format: int64
uptimeMs
required

Wall-clock since process start.

integer format: int64
readyAfterMs

Total boot time, set once ready.

integer format: int64
phases
required

Ordered phase history (completed + the in-flight one).

Array<object>
object
name
required
string
startedAt
required
string format: date-time
endedAt

Absent while the phase is in flight.

string format: date-time
durationMs
required

0 while in flight.

integer format: int64

Example

{
"state": "starting",
"currentPhase": "migrations",
"phases": [
{
"name": "migrations"
}
]
}