Reference

Evidence endpoints

Where the signed proof is published, where the router relays it, the bundle's top-level fields, and the two refusals.

ReferenceFor developers

GET /.well-known/swarm-evidence

Served by the platform's own gateway on the endpoint's hostname, not by the router. No key, Cache-Control: no-store, and no CORS headers: a browser cannot read it cross-origin. This is the document Gatekeeper fetches and verifies.

production, 2026-10-12
$ curl -sI https://api.router.superprotocol.com/.well-known/swarm-evidenceHTTP/1.1 200 OKContent-Type: application/jsonCache-Control: no-store

GET /v1/evidence

The most recently issued bundle this router has fetched for its own endpoint, byte for byte as published, so hashing this response and hashing the platform's copy give the same digest. No key. Cache-Control: no-store, because a bundle is re-signed every few minutes.

This is the copy a browser can read: the console page's tier-1 check uses it when the endpoint will not serve a cross-origin request. The router never validates the signature and never reports a verdict.

GET /v1/evidence/{endpoint}

The same for a named endpoint: a name or hostname from this router's own configuration, or the name of a registered external upstream. Own endpoints resolve first.

For an external endpoint it is the publication the endpoint's last verdict named, not merely the newest the router holds: a fetched upstream bundle is filed only when the TLS leaf it claims is the one the egress observed, and served only for the digest a verdict observed. The endpoint's status does not change what this route does; a denied or disabled upstream's last admitted publication is still relayed, and that is not a claim that the router would route there now.

Refusals

HTTPBodyMeaning
404{"statusCode":404,"message":…}No such endpoint, or on the bare path this router cannot tell which is its own
503{"statusCode":503,"reason":"evidence_not_fetched","message":…}The endpoint exists and nothing has been retrieved for it yet
terminal
$ curl -s https://api.router.superprotocol.com/v1/evidence/nope{"message":"Unknown endpoint \"nope\".","error":"Not Found","statusCode":404}

Never an empty 200: a caller that verifies what it is handed must not have to tell a bundle from the absence of one.

The bundle

Top-level fields of the document the production router publishes:

FieldMeaning
kindDeploymentEvidence
versionSchema version, 1
hostnameThe endpoint the bundle is for
issuedAtWhen it was signed; re-signed every few minutes
certChainPEM certificates, leaf to root
certFingerprintSHA-256 of the TLS leaf's DER, in the wire form sha256/<base64url>
tlsLeafThe TLS certificate itself
jwsThe signature over the snapshot. Its payload carries evidenceDigest and evidence, the snapshot: every resource rendered into the deployment, images by digest and configuration
rootCaTeeQuote{"status":"not-implemented"} today; client-side validation of it is out of scope

The schema is schemas/swarm-evidence-bundle.schema.json in the repository.

Hex and wire form

Everything you read or type is hex: sha256:<64 hex>. That is what every command prints, what the console shows and copies, and what endpoint trust add writes. The wire form, sha256/<base64url>, is what the producer signs into the bundle and what a pin is compared as; it surfaces only in the *Canonical fields of --json output. Input is generous: both forms and bare hex load.