HMAC signature (recommended)
Headers:
Accept the request if any
v1= value matches, and reject timestamps more than 5 minutes old (replay protection). Use the raw body bytes, before any JSON parsing.
removeprefix).
Shared secret header
For tools that cannot compute an HMAC (for example GoHighLevel inbound webhooks): the secret is sent as the value of a header you name (defaultX-Telzino-Secret). Compare it in constant time. Rotating a shared secret is a scheduled switch: you choose when the new value takes over, so you can update your receiver first. Rotating again replaces a switch that is already scheduled, so the admin portal and dashboard ask you to confirm first.
This header has no timestamp or signature, so anyone who captures a request can send it again. De-duplicate on the x-telzino-event-id header.
Other headers
x-telzino-event-id, x-telzino-event-type, x-telzino-delivery-id (quote it to support), x-telzino-attempt.