Skip to main content
At Riyadh Parking, we use Svix to send webhooks. As our operator, it’s important that you verify incoming webhook requests to ensure they are legitimate. Below is the official guide for manual verification of signatures.

Headers Sent with Webhooks

Each webhook call includes the following headers:

How to Construct the Signed Content

To construct the signed content, concatenate the message components using a . (dot):
  • svix_id: from the svix-id header
  • svix_timestamp: from the svix-timestamp header
  • body: the raw body of the request
⚠️ Do not modify the request body before verification. Even small changes will invalidate the signature.

How to Compute the Expected Signature

Svix uses HMAC with SHA-256. You need to:
  1. Take your signing secret (remove the whsec_ prefix).
  2. Decode the base64 portion.
  3. HMAC the signedContent using the decoded secret.

Node.js Example


Matching the Signature

The svix-signature header contains a space-delimited list of versioned signatures, e.g.:
To validate:
  • Remove the version prefix (v1,, v2, etc.).
  • Compare the base64-encoded result with your computed signature.
  • Use constant-time comparison to avoid timing attacks.

Verifying the Timestamp

Always compare the svix-timestamp against your server’s current time.
  • Reject the webhook if the timestamp is outside an acceptable window (e.g., ±5 minutes).
  • This prevents replay/timestamp attacks.

Example Signature

If the timestamp is outdated, verification will fail — this is expected.