---
title: "List nodes for an AI observer"
method: GET
path: "/api/fleet/observation/nodes"
tags: ["Observation"]
---

# List nodes for an AI observer

`GET /api/fleet/observation/nodes`

## Request

- Base URL: `https://localhost:1852`
- URL: `https://localhost:1852/api/fleet/observation/nodes`
- Auth: HTTP bearer

Returns every node this hub knows, projected for an Observe Only token.
Each row carries the node's type, the transport the hub would use to reach
it, its status, the last contact this hub can vouch for, and whether it is
cordoned. Node URLs, compose directories, enrollment credentials, and cordon
reasons are withheld. This endpoint is answered by the hub the caller is
signed into and is one of the five paths an Observe Only token may reach.
Requires `node:read` permission.

## Response `200`

Node list wrapped in the observation envelope.

- object
  - `schemaVersion` 1, required
  - `generatedAt` integer, required: Epoch ms of the evidence behind the answer.
  - `data` ObservationNode[], required
    - `id` integer, required
    - `name` string, required
    - `type` 'local' | 'remote', required
    - `transport` 'local' | 'proxy' | 'pilot', required
    - `status` 'online' | 'offline' | 'unknown', required
    - `lastContactAt` integer, nullable, required: Epoch ms of the last contact this hub can vouch for, or null. The unit is the same for local, proxy, and Pilot nodes.
    - `cordoned` boolean, required

## Other responses

- `401`: Authentication required. Provide a valid Bearer token.
- `403`: Insufficient permissions or license tier.
- `500`: Internal server error.

## Changes

- **2026-11-01** `bef9c9739469`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/studio-saelix/apis/sencho-api/changes/api/fleet/observation/nodes/get.md)

---

[API](https://skmtc.dev/studio-saelix/apis/sencho-api.md) - [All operations](https://skmtc.dev/studio-saelix/apis/sencho-api/llms.txt) - [OpenAPI document](https://skmtc.dev/studio-saelix/apis/sencho-api/revisions/bb1a37e1ed3b?raw)
