What is signed
Three headers come with each request:
The signature is an HMAC-SHA256 of
{webhook-id}.{webhook-timestamp}.{body}, where body is the raw request body, byte for byte. The key is the destination’s signing secret without its whsec_ prefix, base64-decoded.
Reject a request whose timestamp is more than 5 minutes away from your clock: it protects you from a replayed request. The libraries below do it for you.
Node
Python
Flask
Other languages
Standard Webhooks publishes libraries for other languages, all compatible with TIKT’s signature: see standardwebhooks.com. You can also compute the HMAC yourself from the description above.Rotating the secret
In the destination, Rotate creates a new secret and shows it once. From that moment, each request is signed with both secrets for 24 hours:webhook-signature carries two signatures separated by a space, the new one first. Update your endpoint during those 24 hours; after them, only the new secret signs. The libraries accept a request when one of the signatures matches.
Without code
Tools like Zapier or Make can’t always compute a signature. Two simpler options, set in the destination under More options:- A header of your own, for example
Authorization: Bearer <a long random value>, that your tool checks. TIKT stores its value encrypted and never shows it again. - Keep the address secret. The address your tool gives you is hard to guess; don’t share it.
