Node API

Node API

Inspect host capabilities and request cordon, drain, and retirement operations.

The Node API operates organization fleet hosts. Node access is constrained by the caller's permitted regions and is independent of project droplet access.

Inspect inventory

GET/organizations/{organization_id}/nodes
Scope
fleet:read
Auth
Bearer API key

Lists fleet nodes within the permitted region scope.

Requires fleet:read. Filters include region_id, zone_id, pool_id, health, cordoned, and label, plus standard pagination. cordoned accepts only true or false.

GET/organizations/{organization_id}/nodes/{node_id}
Scope
fleet:read
Auth
Bearer API key

Returns the configuration ETag and observed host state. The response separates capacity.physical, capacity.allocatable, capacity.reserved, and usage; clients must not infer free admission capacity by subtracting recent usage from physical memory.

A node response identifies its placement, admission state, and observation time:

JSON
{
  "data": {
    "id": "nod_eu01",
    "revision": 8,
    "region_id": "reg_euwest",
    "zone_id": "zone_a",
    "pool_id": "pool_general",
    "cordoned": true,
    "roles": ["compute", "storage"],
    "cpu_profile_ids": ["cpu_baseline_v2"],
    "observed_at": "2025-11-23T11:30:00Z"
  }
}

Absent observations remain absent rather than becoming zero-valued capacity. A last-observed node ID remains stable through service restarts.

Change admission

PATCH/organizations/{organization_id}/nodes/{node_id}
Scope
fleet:write
Auth
Bearer API key

Updates node admission, labels, taints, or eligible location fields.

Requires If-Match. Writable fields are cordoned, cordon_reason, labels, taints, zone_id, rack, and supported admission limits. Omission preserves a field; labels replaces the full map. Cordoning blocks new destinations without stopping existing guests.

Changing location fields while placement dependencies exist returns 409 node_location_in_use. Use the reviewed evacuation workflow before changing a zone or rack. The destination zone must remain in the node's region. Unsupported admission limits return 422.

Drain

POST/organizations/{organization_id}/nodes/{node_id}/drain-preview
Scope
fleet:write
Auth
Bearer API key

Previews drain destinations and blockers without changing placement.

Accepts an optional destination_pool_id and returns eligible moves and blockers without changing placement. The result records source revisions but does not reserve destinations indefinitely.

POST/organizations/{organization_id}/nodes/{node_id}/actions
Scope
fleet:write
Auth
Bearer API key

Starts a reviewed node drain and cordons the source.

Send type=drain and the preview ID with If-Match. The request returns 202 with a parent operation. The node becomes cordoned. Successful child migrations remain applied when another child fails.

Compute drain does not evacuate replicas. Inspect storage pool evacuation for nodes with a storage role.

Retire

POST/organizations/{organization_id}/nodes/{node_id}/actions
Scope
fleet:write
Auth
Bearer API key

Retires an evacuated node and revokes its identity.

Use the action type=retire only after compute and storage dependencies are clear. It revokes the node identity and returns an operation reference. An occupied host returns 409 node_in_use; an unresolved writer returns 409 fencing_required.

Retirement does not wipe local disks. Use the organization's hardware sanitation procedure before disposing of the host. See node fencing, CPU profiles, and enrollment tokens.

Taint validation

The taints array replaces the complete stored set. Each entry has a nonempty string key, optional string value, and supported effect NoSchedule. An empty array removes all taints. Unsupported effects or duplicate key/effect pairs reject the request without changing the set.

A taint update does not evict existing guests. Use node taints for matching behavior and Hardware policy API for droplet tolerations.