Overview

kurnl sends HTTP POST requests to your webhook_url after significant events. Configure your webhook URL in Dashboard → Settings → Integration. All events share a common envelope structure with event-specific fields merged in at the top level.

Event reference

Payload structure

All payloads include event, provider_document_id, and timestamp. Event-specific fields are merged in alongside them.

Verifying signatures

When you have a webhook_secret configured, kurnl signs every request body with HMAC-SHA256 and sends the signature in the X-Webhook-Signature header as sha256=<hex_digest>. Always verify this signature before processing any event.

Delivery behaviour

  • kurnl attempts delivery up to 3 times with exponential back-off (2s, then up to 30s between retries)
  • Network errors and 5xx responses are retried; 4xx responses are not retried
  • Timeout per attempt: 15 seconds
  • Return any 2xx status to acknowledge — kurnl does not inspect the response body

Idempotency

kurnl may deliver the same event more than once after transient failures. Use job_id or subscription_id as an idempotency key to deduplicate in your handler:

Testing webhooks locally

During development you can use a tunnelling tool to expose your local server to kurnl:
Alternatively, use webhook.site for a no-setup temporary receiver to inspect payloads without running any code.

Debugging delivery failures

In the dashboard under Documentation → Testing & Sandbox, you can see the last 50 webhook delivery attempts for your sandbox, including the response status and body. Failed events can be replayed from the dashboard. For production webhook issues, check Dashboard → Settings → Integration → Webhook Events.