Mesh health (admin)
Loopback-only operational endpoint that reports per-host health across the Ethereum mesh's three pool layers — execution (EL), consensus (CL), and MEV.
GET /v1/eth/mesh/health returns a point-in-time snapshot of every upstream host
behind the Ethereum mesh, grouped by pool layer. Three layers are reported:
el— execution-layer hosts (e.g. JSON-RPC / WS / Engine endpoints).cl— consensus-layer (Beacon) hosts.mev— MEV-related hosts (relay / builder / private order flow).
For each layer the response gives a rolled-up count of hosts that are available, quarantined, or degraded, plus a sorted per-host breakdown including client family, role, capabilities, and the most recent error. It is the authoritative view operators use to answer "is the mesh healthy, and if not, which host and why."
Access is restricted. This endpoint is not reachable from the public internet. It is bound behind an admin auth layer that only accepts requests arriving over the loopback interface, or requests carrying a valid
X-Admin-Tokenheader. Any other caller receives403 Forbidden. There is no API-key (Authorization: Bearer) path to this endpoint — it is an operations/diagnostics surface, not a product API. It is polled by the internal verify-loop on a 1-hour interval.
A layer only appears in the blocks map if its pool is configured and non-nil;
on a deployment where, say, the MEV block is disabled, the mev key is simply
absent.
Parameters
This endpoint takes no path, query, or body parameters. Only GET is accepted;
any other method returns 405.
_(none)_—optionalResponse
200 OK, Content-Type: application/json (pretty-printed). The response also
carries X-Mesh-Source: eth-mesh-admin and Server: Triport.
generated_atstring (RFC 3339, UTC)blocksobjectel / cl / mev) → block health. A layer is omitted if its pool is not configured.blocks.<layer>.blockstringel, cl, or mev).blocks.<layer>.host_countintegerblocks.<layer>.available_countintegerblocks.<layer>.quarantined_countintegerblocks.<layer>.degraded_countintegerblocks.<layer>.hostsarrayid.Errors
| Code | Meaning | When it happens |
|---|---|---|
403 | {"error":"admin endpoint loopback-only"} | Request did not arrive over loopback and carried no valid X-Admin-Token. |
405 | {"error":"only GET supported"} | Any method other than GET. |
These admin responses use a minimal {"error": "..."} shape rather than the
standard product error envelope; for the full envelope used by public endpoints
see errors.
Examples
JavaScript (fetch)
// Run from the proxy host (loopback) or via an admin tunnel.
const res = await fetch("http://127.0.0.1:8080/v1/eth/mesh/health");
const health = await res.json();
for (const [layer, block] of Object.entries(health.blocks)) {
console.log(
`${layer}: ${block.available_count}/${block.host_count} available, ` +
`${block.quarantined_count} quarantined, ${block.degraded_count} degraded`
);
}TypeScript SDK (@triport/sdk)
// This is an internal loopback-only admin endpoint and is not exposed as a
// product method in the public SDK. Call it directly from an authorized host:
const res = await fetch("http://127.0.0.1:8080/v1/eth/mesh/health", {
headers: { "X-Admin-Token": process.env.TRIPORT_ADMIN_TOKEN ?? "" },
});
const health = await res.json();Python (triport-sdk)
# Loopback-only admin endpoint — not part of the public SDK surface.
import os
import requests
resp = requests.get(
"http://127.0.0.1:8080/v1/eth/mesh/health",
headers={"X-Admin-Token": os.environ.get("TRIPORT_ADMIN_TOKEN", "")},
)
resp.raise_for_status()
health = resp.json()
for layer, block in health["blocks"].items():
print(layer, block["available_count"], "/", block["host_count"], "available")Notes
- Loopback-only by design. Treat this as an operator/diagnostics endpoint, not a product API. Expose it to humans through an SSH tunnel or an authenticated admin proxy — never by opening it to the public internet.
- Counts are mutually exclusive. A host is classified once: quarantined
takes precedence over degraded, and degraded over available. So
available_count + quarantined_count + degraded_count == host_countfor each layer. - Stable ordering. Hosts within each layer are sorted ascending by
id, so successive snapshots diff cleanly. - Polling. The internal verify-loop calls this on a 1-hour cadence; ad-hoc manual calls are fine for incident triage.
- For the public, per-product Ethereum surfaces (wallet, mempool, sender,
leak-mesh, validator-intel, peer-graph-intel) see the other pages under
rest/ethereum/.