Heimdall consensus RPC proxy
https://api.triport.io/rpc/polygon-heimdall/statusA transparent reverse-proxy that forwards Polygon **Heimdall** consensus-layer requests (Tendermint RPC, Cosmos LCD, and the consensus Prometheus port) through a single authenticated path on the Triport edge.
Polygon's proof-of-stake layer is split into two node types. The Bor execution layer speaks Ethereum JSON-RPC (documented separately). The Heimdall consensus layer speaks the Tendermint/CometBFT and Cosmos REST (LCD) protocols, and that is what this endpoint exposes — read access to validator sets, checkpoints, consensus state, and historic transaction search.
Everything after the /rpc/polygon-heimdall prefix is treated as a Heimdall
path. The proxy strips that prefix, matches the remaining path against a
fixed whitelist of safe read routes, and forwards the request to a healthy
upstream consensus node. Three logical upstream ports are addressed
transparently based on the route:
- Tendermint RPC (
26657) —/status,/validators,/tx_search, etc. - Cosmos LCD / REST (
1317) — paths under/lcd/... - Consensus Prometheus (
26660) — internal metrics port (route-gated)
The proxy is multi-region aware: requests are served from a regional pool
of consensus nodes, with automatic cross-region failover when the home region
has no healthy host. Pool members are continuously health-checked against the
expected consensus chain ID heimdallv2-137; a node reporting a different
network, or one that is catching up, is taken out of rotation.
Use this endpoint when you need direct, low-level consensus data — checkpoint
status, validator set membership, or historic tx_search queries — that the
execution-layer JSON-RPC cannot answer.
Gotchas
- Read-only. Transaction broadcast paths (
/broadcast_tx_sync,/broadcast_tx_async,/broadcast_tx_commit) are rejected by policy. - Whitelist only. Any path not in the table below returns
404. - Archive routes are strict.
/tx_searchand/block_searchare served only by archive-capable nodes; if none are available you get a typed503rather than a partial result. - Path hygiene. Paths containing
..,//, encoded traversal sequences, or null bytes are rejected with400.
Parameters
There are no fixed query/body parameters at the proxy layer — the request is forwarded as-is to the consensus node, including method, body, and query string. What matters is the path (after the prefix), which must resolve to a whitelisted route.
PathobjectWhitelisted routesobjectResponse
The body is the consensus node's native response, passed through verbatim
(with internal version/identity headers stripped). A /status response looks
like:
Response headers
| Header | Description |
|---|---|
X-Mesh-Source | Always polygon-heimdall — identifies the serving layer. |
Content-Type | Passed through from the consensus node (typically application/json). |
Response fields
Response fields are defined by the underlying Tendermint RPC / Cosmos LCD
protocol and vary per route. For /status, the most useful fields are:
| Field | Type | Description |
|---|---|---|
result.node_info.network | string | Consensus chain ID. Always heimdallv2-137 for healthy nodes. |
result.sync_info.latest_block_height | string | Latest committed Heimdall block height. |
result.sync_info.catching_up | boolean | true if the node is still syncing. |
Errors
All errors use a typed JSON envelope: {"error":{"code":"...","message":"..."}}.
| Code | HTTP | Meaning | When it happens |
|---|---|---|---|
heimdall_path_invalid | 400 | Path contains forbidden segments | .., //, encoded traversal, or null byte in the path. |
heimdall_route_rejected | 404 | Route rejected by policy | A broadcast/operator-internal path (e.g. /broadcast_tx_sync). |
heimdall_route_not_found | 404 | Route not in whitelist | Path is not one of the whitelisted routes. |
heimdall_archive_unavailable | 503 | No archive host available | /tx_search or /block_search requested while all archive nodes are quarantined/degraded. |
heimdall_upstream_exhausted | 503 | All hosts exhausted | Every candidate node failed (transport error or 5xx) within the retry budget. |
Authentication and rate-limit errors share the platform envelope — see the shared errors reference. Rate limiting is RPS-per-tier with burst; there is no daily quota.
Examples
JavaScript (fetch)
const res = await fetch(
"https://api.triport.io/rpc/polygon-heimdall/status",
{
headers: { Authorization: `Bearer ${process.env.TRIPORT_API_KEY}` },
}
);
const { result } = await res.json();
console.log("Heimdall height:", result.sync_info.latest_block_height);TypeScript SDK (@triport/sdk)
import { Triport } from "@triport/sdk";
const triport = new Triport({ apiKey: process.env.TRIPORT_API_KEY! });
// Raw passthrough to the Heimdall consensus proxy.
const status = await triport.polygon.heimdall.get("/status");
console.log(status.result.sync_info.catching_up);Python (triport-sdk)
import os
from triport import Triport
client = Triport(api_key=os.environ["TRIPORT_API_KEY"])
status = client.polygon.heimdall.get("/status")
print(status["result"]["sync_info"]["latest_block_height"])Notes
- Failover & retries. A failed request is retried once on a different host
before returning
heimdall_upstream_exhausted. With multi-region routing enabled, the retry may land in another region. - Caching. Some routes are served with a short server-side cache (e.g.
/validators~5s,/tx_search~30s); volatile routes like/statusare never cached. - Related endpoints. The Bor execution layer is reached through the
standard Polygon JSON-RPC surface. For real-time consensus events, see the
/ws/polygon-heimdallWebSocket firehose. - See the shared authentication and rate limits guides for how the Bearer key and per-tier limits apply across the platform.