Skip to main content
Endpoint creation and explicit secret rotation disclose a whsec_… secret once. Store it in a secret manager. Editing the endpoint URL does not rotate the secret. Sakawave signs this byte sequence:
Compare the supplied 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

Register the raw-body route before any global express.json() middleware. enqueueOnce must use a durable unique constraint on the webhook ID from the Sakawave-Webhook-Id header.

Python with Flask

Never parse and re-serialize JSON before verification. Whitespace and property order are part of the signed bytes.