Skip to content

What the relocation mechanism can do, and what it is doing.

GET
/api/v1/system/relocation
curl --request GET \
--url https://example.com/api/v1/system/relocation \
--header 'Authorization: Bearer <token>'

The mechanism’s state and the current run

Media typeapplication/json

Everything the relocation page needs in one read.

object
archive
One of:
null
enabled
required

Whether a relocation can be started from here: the updater is deployed, alive, the operator’s switch is on, and it supports the command.

boolean
estimate_bytes

Roughly how large the archive will be. ⚠️ Partial — the database plus the metrics. Core cannot see the event, flow or image volumes; only the sidecar can, and its check is the one that can stop a run.

integer | null format: int64
free_bytes

Free bytes on the filesystem holding the hand-off volume.

integer | null format: int64
needed_bytes

estimate_bytes doubled: the copy, and the tar of the copy.

integer | null format: int64
run
One of:
null
supported
required

Whether this deployment’s updater declares the command at all. false on an updater that predates ADR-121 — the next upgrade recreates it.

boolean
updater
required

The updater container’s own state, from the same reading the Upgrade page uses.

object
allow_bundle
required

Whether it will install an uploaded image archive. Off unless the host’s compose file turns it on — it is the only path that can bring an image this deployment never named onto the host, so it is gated separately from the mechanism as a whole (ADR-050 Increment 3).

boolean
bundle_max_bytes

The largest archive core will accept, in bytes. Present whenever allow_bundle is, so the UI can refuse an oversized file before spending an hour uploading it.

integer | null format: int64
check_interval_secs

How often it re-checks the registry, in seconds.

integer | null format: int64
fresh
required

Whether its last report is recent enough for it to be considered alive.

boolean
installed
required

Whether this deployment has an upgrade mechanism at all — that is, whether the host wired the hand-off directory in. false describes how the deployment was installed rather than anything that went wrong: upgrading from the WebUI needs a container composition that carries the privileged updater alongside core, so a native installation, or a composition that does not ship it, cannot offer it. The command-line upgrade path is unaffected.

boolean
last_seen

Unix seconds of its last report.

integer | null format: int64
paused
required

Whether the sidecar has seen the switch turned off. Distinct from upgrade_enabled, which is what this deployment stored: while the two disagree the change has not reached the sidecar yet, which takes at most one of its beats.

boolean
present
required

Whether the updater has ever reported. Meaningful only where installed is true, and there it means the container is missing or has not finished starting — a fault, not a property of the deployment.

boolean
repo

The image repository it is pinned to. Fixed by the host environment and not settable over this API.

string | null
upgrade_enabled
required

The operator’s switch, as stored. Shared with the upgrade mechanism: one sidecar, one switch — turning upgrades off turns this off too, which is deliberate.

boolean
Examplegenerated
{
"archive": {
"filename": "example",
"modified_at": 1,
"size_bytes": 1
},
"enabled": true,
"estimate_bytes": 1,
"free_bytes": 1,
"needed_bytes": 1,
"run": {
"docker_installed": true,
"filename": "example",
"finished_at": 1,
"host_key_fingerprint": "example",
"id": "example",
"images": true,
"message": "example",
"metrics": true,
"mode": "example",
"requested_by": "example",
"size_bytes": 1,
"stage": "example",
"started_at": 1,
"state": "example",
"target_host": "example",
"target_url": "example",
"tier2": true
},
"supported": true,
"updater": {
"allow_bundle": true,
"bundle_max_bytes": 1,
"check_interval_secs": 1,
"fresh": true,
"installed": true,
"last_seen": 1,
"paused": true,
"present": true,
"repo": "example"
},
"upgrade_enabled": true
}

No valid bearer token

Media typeapplication/json

The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies undescribed — a client that has to guess the failure shape ends up parsing the success shape and reading undefined.

object
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}

Role lacks ManageSystem

Media typeapplication/json

The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies undescribed — a client that has to guess the failure shape ends up parsing the success shape and reading undefined.

object
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}

No upgrade mechanism is installed (skeleton mode)

Media typeapplication/json

The ADR-019 envelope every failure renders as. pub(crate) and schema-bearing so the OpenAPI document can name one error shape for every endpoint (ADR-035) instead of leaving 4xx/5xx bodies undescribed — a client that has to guess the failure shape ends up parsing the success shape and reading undefined.

object
error
required
object
code
required

Stable machine-readable code. Clients branch on this, never on the message.

string
message
required

Operator-facing sentence. Safe to display; never carries an internal error’s own text.

string
Examplegenerated
{
"error": {
"code": "example",
"message": "example"
}
}