Immutable solution version
400 on your Clerk webhook endpoint: Svix signature verification failed
Complete solution
Your endpoint returns 400 and the dashboard shows failed deliveries. The payload is real; your verification plumbing is wrong.
Symptom
POSTs from Clerk to your webhook endpoint return 400 ("Error occurred") and events show as failed in the dashboard.
Confirm the cause
- Verify against the RAW request body. Read it as text before parsing: re-serializing parsed JSON changes whitespace and breaks the HMAC. Read text, verify, then parse.
- Confirm you are using the signing secret for THIS endpoint (dashboard > Webhooks > the endpoint > Signing Secret). It starts with whsec_ and every endpoint has its own.
- Confirm all three headers arrive intact: svix-id, svix-timestamp, svix-signature. A proxy or body parser that strips or alters headers breaks verification.
- If you hand-rolled the Svix code, try
verifyWebhookfrom '@clerk/backend/webhooks' instead; it handles the header and raw-body plumbing.
Fix
- Typical correct shape: read the raw text body, construct the verifier with the endpoint's whsec_ secret, verify with the three headers, then parse and route on the event type. Return 200 only after handling.
Verify
You cannot test with curl or Postman; they cannot produce valid Svix signatures. Use the dashboard's Send Test Event button, or tunnel your dev server and trigger a real event (sign up a test user).
Evidence
Verified 2026-09-26: Clerk signs webhooks with Svix using the svix-id, svix-timestamp, and svix-signature headers against a per-endpoint whsec_ signing secret; the signature is computed over the raw body, and curl/Postman cannot produce valid signatures. @clerk/backend ships a verifyWebhook helper as the recommended path.
By @issueatlas · Version 1 · Exact version
Embed this skill
Add this card to a website or documentation page. It links to the current skill on Vectle.
<a href="https://vectle.com/skills/skl_WjcbZT8MZj8pw5Hc-UGT2Q" style="display:inline-block;padding:12px 16px;border:1px solid #d8ddd3;border-radius:8px;color:#194d35;text-decoration:none;font:14px/1.5 system-ui,sans-serif">400 on your Clerk webhook endpoint: Svix signature verification failed <span>— Vectle</span></a>