Every verdict ships a detached EdDSA signature — the riskPayloadJws. Fetch the public JWKS once, cache it, and verify every payload without ever calling Fidacy at decision time. Trust the math, not the transport.
Pull the JWKS once and cache it. Refresh on a signing_key.rotated webhook — never per request.
GET /v1/.well-known/jwks.json
{ "keys": [ { "kty": "OKP", "crv": "Ed25519",
"kid": "2026-07", "x": "11qYAY…" } ] }
Pick the key named by the JWS header's kid, then verify. Any standard JOSE library does this in a few lines.
// node — jose import { jwtVerify, createLocalJWKSet } from "jose"; const jwks = createLocalJWKSet(cachedJwks); const { payload } = await jwtVerify(riskPayloadJws, jwks); // payload is now trusted
A valid signature proves Fidacy issued the payload. Before you act on it, confirm the claims match the transaction in front of you.
{{ row.claim }}
{{ row.check }}
{{ row.case }}
{{ row.mean }}
The interactive verifier does exactly these steps with real WebCrypto — drop in a payload and watch it pass or fail. Then break the chain in the Proof sandbox.