Skip to content

`PATCH /v1/orgs/{org}/hosts/{host_id}` (DAWG-285).

PATCH
/v1/orgs/{org}/hosts/{host_id}
curl --request PATCH \
--url https://api.updawg.net/v1/orgs/example/hosts/example \
--header 'Content-Type: application/json' \
--data '{ "display_name": "example", "labels": "example", "notes": "example" }'
org
required
string

Organization slug.

host_id
required
string

The hst_… id.

Media typeapplication/json

Every field optional. An absent field is left alone; null clears display_name or notes. labels replaces the whole set.

object
display_name
string | null
labels

⚠️ The whole set, not a merge. A merge could never remove a label, and a label is a selector: one left behind keeps the host in a group.

object | null
notes
string | null
Examplegenerated
{
"display_name": "example",
"labels": "example",
"notes": "example"
}

Changed; the host as it now is. A label change queues the host for evaluation, so its proposals and label groups catch up.

Media typeapplication/json
object
agent_install
One of:

How its agent was installed and the channel it follows. A package install updates only to builds its own repository’s channel holds. Absent: an agent too old to say.

object
channel

The channel the package repository follows, e.g. stable. Absent for a binary install, which can take a build from any channel.

string | null
method
required

apt or dnf (the package from pkg.updawg.net), binary (install.sh’s binaries, updated from the signed manifest), or other.

string
agent_mode
required

⚠️ A ceiling, not a setting. The host’s own agent.toml decides this; the server may narrow it and can never widen it. A portal that renders it as editable is describing a control that does not exist.

string
agent_permissions
required
Array<string>
agent_version
string | null
arch
required
string
display_name
string | null
distro
required
string
distro_version
required
string
enrolled_at
required
string format: date-time
frozen
One of:

Its package sources are pinned in time (DAWG-233): updates is measured against a snapshot that does not move. ⚠️ Zero updates on a frozen host is not “patched”, least of all when behind.

object
behind
required

Known to be behind what it is offered. false also when nobody can tell.

boolean
kind
required

releasever (dnf’s release is fixed: Amazon Linux 2023, or /etc/dnf/vars/releasever), snapshot (apt sources on a dated archive snapshot), or other from an agent newer than this server.

string
latest

The newest release it is offered, where its agent can tell.

string | null
pinned
required

What it is pinned to: 2023.5.20240805, 9.2, 20240101T000000Z.

string
hostname
required
string
id
required
string
kernel_version
string | null
labels
required

⚠️ A selector, not decoration. A policy that targets several labels intersects them, and the fleet filter takes them as repeatable key=value, so a client that cannot see the type cannot build either. String to string, enforced by hosts_labels_are_strings rather than asserted here (DAWG-261).

object
key
additional properties
string
last_inventory_at
string | null format: date-time
last_seen_at
string | null format: date-time
machine_id
required

Identity, and not the hostname. Hostnames change and repeat.

string
os_family
required
string
reboot_required

⚠️ Three-valued. null is “this host cannot say”, which is not false. A distribution with no way to answer must not read as “nothing to do here”.

boolean | null
services_need_restart
required
Array<string>
snapshots
One of:

Whether this host can take snapshots, and so be rolled back (DAWG-115). ⚠️ null is an agent too old to say, not a host that cannot: that one has a reason and no provider.

object
provider

The provider in use, e.g. snapper. Absent: none, and reason says why.

string | null
reason
string | null
status
required
string
updates
One of:

⚠️ null means never evaluated, not zero. A host that has never uploaded an inventory has never been looked at, and rendering that as “0 updates” tells somebody their unevaluated fleet is fully patched.

object
requiring_reboot
required

Updates that will leave the host needing a reboot — distinct from reboot_required, which is whether it needs one now.

integer format: int64
security
required
integer format: int64
total
required
integer format: int64
advisory_coverage
required

Whether anything rates this host’s updates (DAWG-215):

  • covered: advisories are published for its release.
  • no_feed: its release is known and no advisory feed covers it — a derivative like Linux Mint, Pop!_OS or Raspbian. ⚠️ Every update here is unrated, which is not the same as safe.
  • unknown_release: not resolved to a known release yet.
string
cert_expires_at
string | null format: date-time
cloud
One of:

What the host said about the cloud it runs in, or absent because it is not in one.

object
instance_id
string | null
provider

aws, gcp, hetzner, … as the host reported it.

string | null
region
string | null
decommissioned_at
string | null format: date-time
groups
required
Array<object>
object
id
required
string
name
required
string
held_packages
required

⚠️ An update for a held package will not install. This is the answer to “why did nothing happen” before anybody has to ask it.

Array<string>
notes

Free text for whoever looks after the box.

string | null
proposals
required

Open proposals only, newest first. A host that has been in four hundred merged proposals is the normal case, and listing them would make this a changelog rather than an answer to “is anything waiting on this box”.

Array<object>
object
id
required
string
number
required
integer format: int32
status
required
string
title
required
string
virtualization
string | null
Examplegenerated
{
"agent_install": {
"channel": "example",
"method": "example"
},
"agent_mode": "example",
"agent_permissions": [
"example"
],
"agent_version": "example",
"arch": "example",
"display_name": "example",
"distro": "example",
"distro_version": "example",
"enrolled_at": "2026-04-15T12:00:00Z",
"frozen": {
"behind": true,
"kind": "example",
"latest": "example",
"pinned": "example"
},
"hostname": "example",
"id": "example",
"kernel_version": "example",
"labels": {
"additionalProperty": "example"
},
"last_inventory_at": "2026-04-15T12:00:00Z",
"last_seen_at": "2026-04-15T12:00:00Z",
"machine_id": "example",
"os_family": "example",
"reboot_required": true,
"services_need_restart": [
"example"
],
"snapshots": {
"provider": "example",
"reason": "example"
},
"status": "example",
"updates": {
"requiring_reboot": 1,
"security": 1,
"total": 1
},
"advisory_coverage": "example",
"cert_expires_at": "2026-04-15T12:00:00Z",
"cloud": {
"instance_id": "example",
"provider": "example",
"region": "example"
},
"decommissioned_at": "2026-04-15T12:00:00Z",
"groups": [
{
"id": "example",
"name": "example"
}
],
"held_packages": [
"example"
],
"notes": "example",
"proposals": [
{
"id": "example",
"number": 1,
"status": "example",
"title": "example"
}
],
"virtualization": "example"
}

Too many labels, an empty key, or a display name or notes that are too long.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

No session.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

Not permitted for this role.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

No such host here.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}

Over the organization’s request limit. Retry-After says when to try again; RateLimit-Limit is the burst.

Media typeapplication/json
object
detail
string | null
status
required
integer format: int32
title
required
string
type
required
string
Examplegenerated
{
"detail": "example",
"status": 1,
"title": "example",
"type": "example"
}