Health reports whether the event plane can take a write and the warehouse can…
Health reports whether the event plane can take a write and the warehouse can answer a read.
GET /v1/event/health
| Address | https://api.hanzo.ai/v1/event/health |
| Method | GET |
| Operation | get_event_health |
| Auth | Authorization: Bearer $HANZO_API_KEY |
Health reports whether the event plane can take a write and the warehouse can answer a read.
It reports the analytics subsystem's own liveness in BOTH directions: plane is the event plane it WRITES (the bus and the JetStream stream every accepted event is published to, both named in the report), and datastore is the warehouse it READS, with each read lens's table reported as it is provisioned (the LLM usage ledger and the product-event table).
EITHER ONE DOWN IS A 503, and the report says WHICH — they are probed independently and never collapse into a single bit. This endpoint used to report the read half only, and answered 200/ok while every POST /v1/event failed on a stream that could not bind: a total ingest outage behind a green probe. A readiness gate here now gates on the write path too.
plane.ready IS A REAL PROBE and walks the ingest path itself — the same connection and the same stream a publish uses — so it cannot answer ready while a publish would 503. plane.reason carries the plane's own error text when it is false.
datastore IS NOT PROBED WITH A QUERY. It is the state of the process's own shared client — established, and not since closed — so a warehouse accepting connections and failing reads still reports true. Degraded CARRIES the report (status, the failing half, reason) as its body rather than an error envelope, so a gate reads the cause off the same object it got at 200.
A MISSING LENS TABLE IS NOT A FAILURE and never moves the status: a lens reported available:false answers honest-empty rather than erroring, so a fresh deployment whose collector has not emitted yet is legitimately 200 with the product-event lens unavailable. The lens block is reported whenever the warehouse is REACHABLE — including on a report degraded by the plane, where the tables genuinely were probed — and is absent only when the warehouse is not, having nothing to say about tables it could not reach.
Unauthenticated on purpose — liveness has to be probe-able — and it reads NO tenant data: table existence and stream presence only, never a row and never an event.
Request
GET /v1/event/health takes no parameters and no body — the credential is the whole request.
Response
| Status | Body | Meaning |
|---|---|---|
200 | healthReport | ok |
503 | healthReport | service unavailable |
200 body — 20 fields.
| Field | In | Type | Always | Description |
|---|---|---|---|---|
datastore | body | boolean | — | Datastore reports whether the shared warehouse client has a live connection. |
lenses | body | healthLenses | — | |
lenses.events | body | healthLens | — | |
lenses.events.available | body | boolean | — | Available reports whether that table exists in the warehouse right now. |
lenses.events.table | body | string | — | Table is the fully-qualified warehouse table the lens reads. |
lenses.llm | body | healthLens | — | |
lenses.llm.available | body | boolean | — | Available reports whether that table exists in the warehouse right now. |
lenses.llm.table | body | string | — | Table is the fully-qualified warehouse table the lens reads. |
lost | body | loss | — | |
lost.exhausted | body | integer | — | Exhausted counts facts the bus abandoned after maxDeliver failed inserts. |
lost.undecodable | body | integer | — | Undecodable counts messages acked without landing because they did not parse. |
plane | body | healthPlane | — | |
plane.bus | body | string | — | Bus is the address this process reaches the plane at. |
plane.ready | body | boolean | — | Ready reports whether an ingest would succeed right now. |
plane.reason | body | string | — | Reason is the plane's own failure text, present only when Ready is false. |
plane.stream | body | string | — | Stream is the JetStream stream every signal lands on. |
reason | body | string | — | Reason is the human-readable cause, present only on a degraded report. |
service | body | string | — | Service names the subsystem answering, so a probe aggregating several health endpoints can attribute a degraded one. |
status | body | string | — | Status is ok or degraded. Degraded is the 503 and means EITHER load-bearing dependency is down — the warehouse this subsystem reads, or the event plane it… |
warehouse | body | string | — | Warehouse names the datastore database every lens reads. |
Failure carries the platform error shape — see Errors.
Examples
hanzo has no subcommand for this operation — the CLI serves only what cloud's live route table confirms. Use HTTP or an SDK.
import { Configuration, EventApi } from 'hanzoai';
const api = new EventApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getEventHealth();from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import EventApi
client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = EventApi(client).get_event_health()cfg := cloud.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := cloud.NewAPIClient(cfg)
resp, _, err := client.EventAPI.GetEventHealth(context.Background()).Execute()
if err != nil {
return err
}use hanzo_cloud::apis::{configuration::Configuration, event_api};
let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();
let result = event_api::get_event_health(&cfg, Default::default()).await?;import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.EventApi;
ApiClient client = new ApiClient();
client.setRequestInterceptor(b -> b.header("Authorization", "Bearer " + System.getenv("HANZO_API_KEY")));
var result = new EventApi(client).getEventHealth();The method above is the one at the current release of the document. [email protected] (npm) and [email protected] (PyPI) were generated from an earlier release, where this operation carried a different id, so it spells the method differently — regenerating the clients is what makes the two agree. SDKs →
curl https://api.hanzo.ai/v1/event/health \
-H "Authorization: Bearer $HANZO_API_KEY"The door declares no tool for event — tools/list on https://api.hanzo.ai/v1/mcp names the products it does reach. Use HTTP or an SDK.
How is this guide?