---
title: "Health"
method: GET
path: "/health"
tags: ["health"]
---

# Health

`GET /health`

Liveness + capabilities + cascade readiness probe.

``status`` stays ``"ok"`` whenever the process is up — the HTTP code
is a *liveness* signal and a degraded cascade must not trigger a
restart (a crash-loop fixes neither a bad md file nor disk bloat).
The ``cascade`` block is the *readiness* signal: ``healthy=false``
with human-readable ``reasons`` **only** when the projection pipeline
itself is stuck (drain failing, optimize stuck, version cleanup
stalled). ``failed_permanent`` — files awaiting ``cascade fix`` — is
a data-quality backlog reported as an informational count that does
not flip ``healthy``. Alert on ``cascade.healthy``.

## Response `200`

Successful Response

- HealthResponse — Response schema for ``GET /health``. Declared as a Pydantic model (not ``dict``) so the generated OpenAPI schema carries the full field shape — ``capabilities``, ``disabled_features`` and ``cascade`` are typed. A bare ``-> dict`` return type degrades the OpenAPI response to ``additionalProperties: true``, which robs clients (and codegen) of any structure to lean on.
  - `status` string, required
  - `version` string, required
  - `capabilities` HealthCapabilities, required — Availability flags for the five capability probes. Field order matches the health-endpoint payload contract; clients key off these names to decide whether to expose optional features.
    - `llm` boolean, required
    - `embed` boolean, required
    - `rerank` boolean, required
    - `multimodal_llm` boolean, required
    - `parser` boolean, required
  - `disabled_features` string[], required
  - `cascade` CascadeHealthBlock — Readiness of the md → LanceDB projection (cascade) subsystem. ``healthy`` reflects **operational** health only — drain loop alive, optimize not stuck, version cleanup (prune) not stalled — and is what alerting should watch. ``failed_permanent`` (md files awaiting ``cascade fix``) is a normal data-quality backlog reported as an informational count; it does **not** flip ``healthy``, otherwise the signal would sit red forever.
    - `healthy` boolean, required
    - `reasons` string[], required
    - `pending` integer, required
    - `failed_permanent` integer, required
    - `failed_retryable` integer, required
    - `drain_consecutive_failures` integer, required
    - `unrecoverable_total` integer, required
    - `optimize_failure_streak` integer, required
    - `prune_stale_seconds` number, required

## Changes

- **2026-08-03** `f8fcba53db33` — 1 info
  - added the optional property `cascade` to the response with the `200` status
- **2026-07-29** `c17a368c8a8c` — 4 info
  - added the required property `capabilities` to the response with the `200` status
  - added the required property `disabled_features` to the response with the `200` status
  - added the required property `status` to the response with the `200` status
  - added the required property `version` to the response with the `200` status

[Change history](https://skmtc.dev/evermind-ai/apis/everos/changes/health/get.md)

---

[API](https://skmtc.dev/evermind-ai/apis/everos.md) · [All operations](https://skmtc.dev/evermind-ai/apis/everos/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/evermind-ai/everos/revisions/9a2e78d664d6/schema)
