Skip to main content
Webhooks let your application react to events in Lumin as they happen. Instead of repeatedly calling the API to check for changes, Lumin sends an HTTP POST request to your endpoint with a JSON payload describing the event. Common use cases include:
  • Downloading signed documents as soon as all parties complete signing
  • Keeping external systems like CRMs or ERPs in sync with signing status
  • Notifying your team when a document is declined or cancelled
  • Triggering internal workflows after a signature request is approved

How webhooks work

When an event occurs in Lumin, the following sequence happens:
1

Event is triggered

A user or API action causes an event — for example, all signers complete a document.
2

Lumin sends a notification

Lumin POSTs a JSON payload to your registered webhook URL describing the event.
3

Your server acknowledges

Your endpoint returns HTTP 200 OK to confirm receipt. No response body is required.
4

Your logic runs

Your application processes the event — for example, calls GET /v1/signature_request/{id}/file to download the signed PDF.

Example workflow

A user sends a signature request in Lumin Sign. Once all signers complete it:
  1. Lumin sends a signature_request_approved event to your endpoint.
  2. Your server returns 200 OK.
  3. Your app calls GET https://api.luminpdf.com/v1/signature_request/{id}/file to download the Certificate of Completion and signed PDF.

Types of webhooks

Lumin supports two webhook types, scoped differently:
  • Account webhooks — Configure once and receive all supported events workspace-wide.
  • App webhooks — Scoped to the permissions your OAuth app has been granted.

Supported event types

Event payload structure

All webhook events share the same JSON structure:

Retry schedule

If your endpoint does not return 200 OK, Lumin retries delivery up to six times:

Failure conditions

A delivery attempt is considered failed when:
  • Timeout — your endpoint does not respond within 30 seconds
  • Non-200 response — your endpoint returns any HTTP status other than 200
  • Connection failure — Lumin cannot connect to your endpoint

Best practices

Respond immediately, process asynchronously. Return 200 OK as quickly as possible, then handle the event in a background job. This keeps your response time well under the 30-second timeout.
  • Implement idempotency — Lumin may deliver the same event more than once due to retries. Use signature_request_id and event_type together as a unique key to detect and ignore duplicates.
  • Verify signatures — Every request includes an X-Signature header. Always validate it before processing the payload. See Account webhooks and App webhooks for verification details.
  • Log all events — Store raw payloads for debugging and audit purposes.
  • Use HTTPS — Lumin only delivers webhooks to HTTPS endpoints.