Why verify?
Your webhook URL is public. Signature verification proves the request came from RaaS Widgets, that the body was not altered, and (with a timestamp window) that it is not a stale replay.Headers
Every delivery includes:Algorithm
Verification steps
1
Read headers and raw body
Capture
X-RAAS-Signature, X-RAAS-Timestamp, and the unmodified request body.2
Compute expected HMAC
Sign
timestamp + "." + rawBody with your webhook secret (SHA-256).3
Compare safely
Use a constant-time compare against the hex digest (strip the
sha256= prefix).4
Reject stale timestamps
Optionally reject timestamps older than ~5 minutes to limit replay.
Node.js (Express)
Python (Flask)
Common mistakes
Re-serializing JSON before verify
Re-serializing JSON before verify
Parse only after HMAC check. Re-
JSON.stringify can change whitespace/key order and break the signature.Non-constant-time compare
Non-constant-time compare
Use
timingSafeEqual / compare_digest, not ===.Skipping timestamp checks
Skipping timestamp checks
Without a freshness window, captured payloads can be replayed.
Regenerate the secret
- Open the Partner Portal
- Go to Settings → Webhooks
- Regenerate the secret and deploy the new value to your servers
Next steps
Events
Payload shapes for each event.
Overview
Retries, timeouts, and configuration.