whsec_… secret once. Store it in a secret manager. Editing the endpoint URL does not rotate the secret.
Sakawave signs this byte sequence:
v1=<hex> signature with an HMAC-SHA-256 digest using a constant-time comparison. Reject missing headers, malformed signatures, and timestamps outside your tolerance before parsing JSON.
Node.js with Express
express.json() middleware. enqueueOnce must use a durable unique constraint on the webhook ID from the Sakawave-Webhook-Id header.