Overview
kurnl sends HTTP POST requests to yourwebhook_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
| Event | When fired | Key fields |
|---|---|---|
subscription.activated | Subscription becomes ACTIVE | subscription_id, subscriber_id, plan_version_id, location_hash |
subscription.pending_install | Home-drop signup received — install not yet done | subscription_id, subscriber_id, unit_id |
subscription.cancelled | Subscription cancelled from any source | subscription_id |
provisioning.completed | SSH port provisioning finished successfully | job_id, subscription_id |
provisioning.failed | SSH provisioning failed after all retries | job_id, subscription_id, error |
Payload structure
event, provider_document_id, and timestamp. Event-specific fields are merged in alongside them.
Verifying signatures
When you have awebhook_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
2xxstatus to acknowledge — kurnl does not inspect the response body
Idempotency
kurnl may deliver the same event more than once after transient failures. Usejob_id or subscription_id as an idempotency key to deduplicate in your handler: