{
  "keys": [
    {
      "kty": "EC",
      "crv": "P-256",
      "x": "Kz4rMf7KijSNaEGamSr5-lXStkDWWoceH_hUCpLXDlM",
      "y": "W7RxsJVCA-5Tsu5RvzFpubeOogXjNUDXj-cGjPVYT-M",
      "use": "sig",
      "alg": "ES256",
      "kid": "flowdesk-receipts-2026"
    },
    {
      "kty": "EC",
      "crv": "P-256",
      "x": "9CnBDZBC3rTfcSnaYKuNbO49P-z7JIorddTZE6vVRS8",
      "y": "sia2WIyBK9-nP5Mv2_UwK33stUULkJmtkoUsF0KyZ_A",
      "use": "sig",
      "alg": "ES256",
      "kid": "flowdesk-envelopes-2026"
    },
    {
      "kty": "EC",
      "crv": "P-256",
      "x": "KWybJkyKheYCkJPpLP9KH0Tcmr9aljmaE66i3c0ZP7I",
      "y": "QX1I6-lT4ZKeq8YDmXJT0m_s9ZuQEdZQVZPZraR2_BI",
      "use": "sig",
      "alg": "ES256",
      "kid": "flowdesk-webhooks-2026"
    }
  ],
  "purpose": "Public keys for verifying FlowDesk signatures. 'flowdesk-receipts-2026' verifies audit receipts. 'flowdesk-envelopes-2026' verifies signed MCP response envelopes and signed API responses (passports, fleet rosters, context handles, agreements). 'flowdesk-webhooks-2026' verifies outbound webhook deliveries — every webhook FlowDesk sends carries an ES256 signature over `timestamp + \".\" + body` in the X-FlowDesk-Signature-ES256 header, so a receiving system can confirm a cross-system action genuinely came from FlowDesk WITHOUT any shared secret (the existing HMAC X-FlowDesk-Signature header remains for shared-secret receivers).",
  "algorithm": "ECDSA, curve P-256, SHA-256",
  "signature_format": "detached IEEE P1363 (raw r||s, 64 bytes), base64url, over the UTF-8 bytes of the signed content (the MCP tool-result text for envelopes; the canonical JSON receipt bytes for receipts)",
  "verify_example": "k = await crypto.subtle.importKey('jwk', jwkByKid, {name:'ECDSA',namedCurve:'P-256'}, false, ['verify']); ok = await crypto.subtle.verify({name:'ECDSA',hash:'SHA-256'}, k, b64urlToBytes(sig), new TextEncoder().encode(contentText))"
}
