Skip to main content

Overview

SignProof fires webhooks when significant events happen on your envelopes. Your backend receives an HTTP POST with a JSON payload. You control what happens next — SignProof doesn’t know or care.

Configure a webhook endpoint

secret is used to sign the payload (HMAC-SHA256). Store it in your secrets manager.

Event types


Payload format


Verifying the webhook signature

Every webhook request includes a X-SignProof-Signature header containing an HMAC-SHA256 signature of the raw request body, computed using your webhook secret. Always verify this signature before processing the payload. This prevents attackers from spoofing events.
Use a constant-time comparison (hmac.compare_digest, timingSafeEqual, FixedTimeEquals). A naive == comparison leaks timing information that can be exploited.

Responding to webhooks

Your endpoint must return 2xx within 10 seconds. If it times out or returns a non-2xx status, SignProof will retry. Do not do heavy work inside the webhook handler. Acknowledge receipt immediately and process asynchronously:

Retry schedule

If your endpoint doesn’t return 2xx within 10 seconds, SignProof retries with exponential backoff: After 5 failed attempts, the delivery is marked as failed. You can view failed deliveries and trigger a manual resend in the Console under Webhooks → Deliveries.

Idempotency

Webhooks may be delivered more than once (network retries can cause duplicates even after a successful delivery). Use the id field (evt_01HX...) to deduplicate:

Testing webhooks locally

Use ngrok or Cloudflare Tunnel to expose your local server: