Skip to main content

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.
Always verify signatures before processing. Never trust the JSON body without a valid HMAC.

Headers

Every delivery includes:

Algorithm

Use the raw body bytes (before JSON parse). Store the secret from the Partner Portal as something like:

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

Parse only after HMAC check. Re-JSON.stringify can change whitespace/key order and break the signature.
Use timingSafeEqual / compare_digest, not ===.
Without a freshness window, captured payloads can be replayed.

Regenerate the secret

  1. Open the Partner Portal
  2. Go to Settings → Webhooks
  3. Regenerate the secret and deploy the new value to your servers
The previous secret stops working immediately. Update your environment before or right after regenerating.

Next steps

Events

Payload shapes for each event.

Overview

Retries, timeouts, and configuration.