Skip to main content

How signing works

Every webhook delivery includes these headers: The signature is computed as:
where:
  • secret is your webhook signing secret (returned when you create a webhook)
  • the timestamp is the value of the X-Render-Timestamp header
  • raw_body is the raw (unparsed) request body bytes
To verify, recompute the HMAC over "{timestamp}.{raw_body}", hex-encode it, and constant-time compare it against the hex digest after the sha256= prefix in the X-Render-Signature header.

Verification example

Always use a constant-time comparison (timingSafeEqual / hmac.compare_digest) to prevent timing attacks.

Rotating the secret

Response:
Signing is workspace-level: rotating re-keys every webhook endpoint and every per-request webhook_url callback in the workspace. Update all of your verifiers immediately after rotation — the old secret stops working as soon as the new one is issued.