Skip to main content
Every webhook request includes these headers: The signature is the lowercase hexadecimal HMAC-SHA256 digest of:
Verify the exact raw request bytes. Parsing JSON and serializing it again can change whitespace or key ordering and invalidate the signature.

Node.js Example

Pass the current secret in secrets. During a planned rotation, temporarily pass both the new and previous secrets until the overlap expires.

Rotation Behavior

When you rotate a secret, the new secret is active immediately and the previous secret remains valid for 24 hours. During that overlap the signature header is:
Deploy verification for the new secret before removing the old one. After the previous_secret_valid_until timestamp, remove the previous secret from your receiver.

Safe Processing Order

  1. Read the raw request body.
  2. Validate the timestamp and signature.
  3. Parse the JSON.
  4. Deduplicate by the event id.
  5. Persist or enqueue the event.
  6. Return a 2xx response.
Never perform irreversible booking work before signature verification and deduplication succeed.