Skip to main content

Verify signatures

Every connection webhook delivery is signed so you can confirm it came from Zapier and was not modified in transit. Zapier follows the Standard Webhooks specification, so you can verify deliveries with any Standard Webhooks library or with a short amount of code. Always verify the signature before you act on a payload.

What you need

  • The signing secret (whsec_…) returned when you created the webhook. If you did not store it, delete the webhook and create a new one to get a fresh secret.
  • The raw request body, exactly as received. Do not parse and re-serialize it before verifying: JSON re-serialization can change the bytes and break the signature.

Signature headers

Each delivery includes three headers: The signed content is the string {webhook-id}.{webhook-timestamp}.{raw-body}. The signature is the base64-encoded HMAC-SHA256 of that string, keyed by the secret with its whsec_ prefix removed and the remainder base64-decoded. The official Standard Webhooks libraries handle signature construction, base64 decoding, and timestamp tolerance for you.

Verify manually

If you cannot add a dependency, reconstruct and compare the signature yourself. This mirrors the official libraries: strip the whsec_ prefix, base64-decode the key, build the signed content, and compare with a constant-time function.

Reject old deliveries

To limit replay attacks, reject a delivery whose webhook-timestamp is too far from the current time. The Standard Webhooks libraries apply a five-minute tolerance by default. If you verify manually, apply the same check.

Respond to Zapier

  • Return a 2xx status once you have verified and accepted the delivery.
  • Return a non-2xx status if you cannot process the delivery. A 429 or 5xx response triggers a retry. For retry and Retry-After behavior, go to Error handling.
  • Deduplicate on webhook-id: the same event can be delivered more than once, so make your handler idempotent.

Next steps