Each PUSH delivery is signed so you can prove it came from Endl. Always verify before acting on a webhook.
Three things to get right. It is SHA-512, not SHA-256. The hex is lowercase. And you must HMAC the raw received body bytes — parsing the JSON and re-serializing it changes those bytes and breaks the signature.
Example delivery
The body is a single compact line, and the signature covers exactly those bytes. Its top level is always eventId, eventType, eventCreatedAt, version, and data; your event’s own fields sit under data, where every leaf value is a string. No subscription id is sent.
Verify the signature
Both examples compare in constant time and accept a list of secrets. That list is what makes rotation safe — see below.
Replay and rotation
The timestamp is covered by the signature, so you can trust it: reject deliveries older than about five minutes to bound replay.
Rotation is instantaneous server-side, with no overlap window. Endl starts signing with the new secret the moment you rotate, so during your own rollout accept either the current or the previous secret until every instance has the new one.
Deduplicate on X-WEBHOOK-EVENT-ID. Retries and manual sends can deliver the same event more than once, and a receiver that is idempotent on the event id handles all of it for free.