How do I verify your webhook signatures?

Every signed delivery carries TWO headers: a timestamp and an HMAC-SHA256 signature. The digest covers the timestamp and the body joined by a dot, not the body alone.

Updated

The signed string is the timestamp, a dot, then the exact request body. Compute the HMAC over the RAW body, before any JSON parsing: re-serialising changes whitespace and breaks the comparison. The signature covers what actually goes out, whatever its shape: JSON, form, or an empty body for a GET.

x-yacla-timestamp: 1755000000
x-yacla-signature: <hex>

signature = HMAC_SHA256(secret, timestamp + "." + body)

The secret belongs to the flow and is shown to you only once, when it is created. Signing can also be turned off on a flow: both headers are then simply absent.

Compare in constant time and reject a timestamp older than five minutes, otherwise the signature does not protect against replay.

Read next

Still missing an answer?

Support can see your account and your deliveries. Asking them is faster than searching any longer.

Contact support