TriportRPC

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.

Ethereum— (not a public, scoped API method)— (internal admin endpoint; no public tier)

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-Token header. Any other caller receives 403 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)_optional
No parameters.

Response

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)
When the snapshot was taken.
blocksobject
Map of layer key (el / cl / mev) → block health. A layer is omitted if its pool is not configured.
blocks.<layer>.blockstring
The layer key, repeated (el, cl, or mev).
blocks.<layer>.host_countinteger
Total hosts in the pool.
blocks.<layer>.available_countinteger
Hosts neither quarantined nor degraded.
blocks.<layer>.quarantined_countinteger
Hosts currently quarantined.
blocks.<layer>.degraded_countinteger
Hosts marked degraded but not quarantined.
blocks.<layer>.hostsarray
Per-host status, sorted ascending by id.

Errors

CodeMeaningWhen 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_count for 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/.