Set up an endpoint
Endpoints belong to one Environment: a Test endpoint receives Test events only, and a Live endpoint receives Live events only. Create one in the Console (Developers → Webhooks → Create endpoint) or through the API:urlmust be HTTPS and cannot carry credentials or fragments.eventTypesis a filter list; omit it (or send[]) to subscribe to every event type.- The response returns the endpoint plus its signing secret (
whsec_…), shown exactly once. Store it immediately; afterwards only a display prefix and the last four characters are retrievable.
The delivery envelope
Every delivery is aPOST with a JSON envelope:
businessId is present on Business-scoped events. version is the envelope schema version (currently 1).
Event types:
Delivery headers
Verify the signature
Thev1 value is the hex HMAC-SHA256 of the string "<t>.<raw request body>", keyed with the endpoint’s signing secret. Verification has three parts: recompute the digest over the raw, unparsed body, compare it timing-safely against every v1 value in the header, and reject timestamps older than your tolerance (300 seconds recommended).
Always verify against the raw body exactly as received. Parsing the JSON and re-serializing it — even with the same keys — can change whitespace or ordering and will invalidate the signature.
node:crypto (no SDK):
v1 values during a secret-rotation window; accept the delivery if any of them match, exactly as the snippets above do.
Retries, exhaustion, and replay
Return any2xx to acknowledge a delivery. Anything else — non-2xx, timeout (deliveries give up after 10 seconds), or a connection failure — schedules a retry:
After the fifth failure the delivery is marked
exhausted and no further automatic attempts are made. You can then fix your receiver and replay: POST /v1/webhook-deliveries/{deliveryId}/replay (or the replay action in the Console) creates a new pending delivery with the same payload, linked to the original. The original delivery and its attempt history are never mutated.
Test events
POST /v1/webhook-endpoints/{id}/test-events (or Send test event in the Console) queues a webhook.test delivery for one endpoint. It is signed and delivered exactly like a real event, so it exercises your verification code end to end without touching pricing data.
Deduplicate on the event id
Delivery is at-least-once. Retries after a receiver-side commit (for example, your server stored the event but the response timed out) and manual replays can both deliver the same event more than once. Key your idempotency on the event id (Kordless-Event-Id, also envelope id) and skip events you have already processed.
Receiver expectations
- Timeout. Respond within 10 seconds; do slow work asynchronously after acknowledging.
- Source. Deliveries originate from the Kordless instance’s outbound IP range and are authenticated by signature — treat the signature, not the source IP, as the authentication mechanism.
- Ordering. Events for one Environment are delivered in outbox order under normal operation, but retries can reorder individual events; order by
createdif your consumer requires it. - Secrets. Signing secrets are shown once at creation and rotation. The platform stores them reversibly because it must sign with them — unlike API keys, which are stored as one-way SHA-256 digests. Rotate with
POST /v1/webhook-endpoints/{id}/secret-rotation; pending deliveries then sign with the new secret.
Next steps
- Request logs — trace a request to its Quote, Book Version, and webhook deliveries.
- Errors — the error envelope returned by the endpoint-management routes.
- Browse the full API reference for endpoint schemas.