Webhooks are signed with the Standard Webhooks scheme:
HMAC-SHA256 over the message id, timestamp and raw body, using your endpoint’s secret. Use a
Standard Webhooks library rather than writing your own; each one checks the signature and rejects
timestamps more than five minutes old, which stops replays.
Verify against the raw request body, byte for byte. If your framework parses JSON first and
you re-serialize it, the signature won’t match. Parse the body only after verifying it.
Get the secret from the dashboard or GET /v1/webhooks/endpoints/{id}/secret. Pass it with its
whsec_ prefix; the libraries accept it as is.
Rotating the secret
POST /v1/webhooks/endpoints/{id}/secret/rotate issues a new secret. For a short while FastCAC
signs with both the old and the new secret (the webhook-signature header carries both), so you
can deploy the new secret without dropping events.