---
title: "Node readiness evidence"
method: GET
path: "/api/readiness/evidence"
tags: ["Fleet"]
---

# Node readiness evidence

`GET /api/readiness/evidence`

## Request

- Base URL: `https://localhost:1852`
- URL: `https://localhost:1852/api/readiness/evidence`
- Auth: HTTP bearer

This node's readiness evidence: workload, security, and stored recovery
facts, in the minimal shape the Fleet Readiness fan-out consumes. The
control instance reads this during its fan-out, so a node that does not
answer, or a domain it cannot produce, reads as unknown rather than as
healthy. Requires `stack:read` permission.

## Headers

- `x-node-id` integer

## Response `200`

Readiness evidence for the node.

- NodeReadinessEvidence: One node's own workload and security facts, served by `GET /api/readiness/evidence` for the hub's fleet fan-out. Evidence, not verdicts: the hub owns the mapping from these facts to a domain state and reason code.
  - `generatedAt` integer, required: Epoch ms this payload finished assembling, taken after both domains settled. Not the age of either domain: each carries its own `generatedAt` below, and a consumer ages a cell by its domain's.
  - `workloads` object, nullable, required: This node's workload facts, or null when they could not be read: `{ "generatedAt": <epoch ms>, "counts": { <status>: <number> }, "degraded": <boolean>, "stale": <boolean>, "problems": [{ "stack": <string>, "status": "exited" | "unknown" | "partial" }] }`. Every status other than `running` is a problem, `unknown` and `partial` included. `degraded` and `stale` describe how the read itself went and are the only signal that a served payload is no longer current.
  - `security` object, nullable, required: This node's security posture pass, or null when it could not be computed: `{ "generatedAt": <epoch ms>, "posture": <string>, "posturePartial": <boolean>, "scannerAvailable": <boolean>, "staleScans": <number>, "failedScans": <number>, "lastSuccessfulScanAt": <epoch ms|null> }`. `posture` is authoritative over the fields beside it; `posturePartial` is true when any bounded pass behind the posture was capped, so a `0` beside it is ambiguous between "none" and "not counted".

## Other responses

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

## Changes

- **2026-09-24** `d8373a6de800`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/studio-saelix/apis/sencho-api/changes/api/readiness/evidence/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/1f7572eb735f?raw)
