Independent verification

Check a response without trusting us.

Every answer this system returns is signed over canonical JSON and carries the address of the key that signed it. That is only worth something if you can check it yourself, with tools you already have — so here is exactly how, in four steps, using nothing of ours.

Everything below is a real, live endpoint. Substitute any publisher slug for {publisher} — the slug is the last path segment of that business's public page at /b/{publisher}.

What a signed response carries

Alongside the answer itself, every envelope carries the fields that make it checkable. Three of them are addresses you can fetch right now.

coverageresolved, needs_context or not_covered — never a guess in between
attestation.kidwhich key signed this, so you know which one to fetch
attestation.jwks_urlwhere that key is published
revocation_urlwhere withdrawals for this publisher are listed
expires_atafter which the signature is no longer a current claim
data ageworst-case age of the data used, and whether it breaches the publisher's declared SLA

1 · Fetch the publisher's key set

Keys are per-publisher, not per-platform. Nothing about this request goes through an authenticated path, and the response is a standard JWKS document.

public key set
curl https://x-protocols.com/t/{publisher}/.well-known/x-protocol/jwks.json

{"keys":[{"kty":"OKP","crv":"Ed25519",
          "x":"…base64url public key…",
          "kid":"kc_…","use":"sig","alg":"EdDSA"}]}

Match the kid from the envelope's attestation block to a key in this set. A rotated key stays published, so an old envelope remains verifiable after a rotation.

2 · Recompute the digest

The signature is over a canonical serialisation of the payload, not over whatever bytes happened to arrive. Canonicalisation is deliberately boring, so that two implementations that have never seen each other agree:

3 · Check the signature

Any Ed25519 implementation will do. This is the whole check, in a language most people already have, importing nothing from us:

verify.py
import base64, hashlib, json, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey

def b64u(s): return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))

env  = json.load(urllib.request.urlopen("…your saved envelope…"))
att  = env.pop("attestation")          # excluded from its own digest
body = json.dumps(env, sort_keys=True, separators=(",", ":"),
                  ensure_ascii=False).encode()

jwks = json.load(urllib.request.urlopen(att["jwks_url"]))
key  = next(k for k in jwks["keys"] if k["kid"] == att["kid"])

# Raises if the signature does not match. No news is good news.
Ed25519PublicKey.from_public_bytes(b64u(key["x"])).verify(
    b64u(att["signature"]), hashlib.sha256(body).digest())
print("signature valid")

4 · Check it has not expired or been withdrawn

A valid signature says the publisher asserted this. It does not say the assertion is still current — that is what the other two fields are for, and skipping them is the most common way a correct-looking verification is still wrong.

revocation feed
curl https://x-protocols.com/t/{publisher}/.well-known/x-protocol/revocations.json

Compare expires_at against now, then check whether this envelope's kid, entity or digest appears in the feed within a window covering when it was signed. Revocation is a window, not an instant: withdrawing a wrong answer must not also withdraw the correction that fixed it.

A publisher that does not exist gets a 404, not an empty list

Asking for the revocation feed of an unknown publisher returns 404 {"error":"unknown_publisher"} — deliberately, because an empty entries array is a positive claim that nothing was withdrawn. If your verifier treats "no such publisher" as "nothing revoked", it will pass envelopes it should refuse.

If a check fails

Treat the answer as unverified and tell us — sign in and use the support link, or write to the address on your invoice. A signature that does not verify is either a bug on our side or something worse, and both are things we want to hear about immediately.