Skip to main content
Webhooks push every domain event in an Environment to an HTTPS endpoint you control. Each delivery is signed with an endpoint-specific secret, retried on a fixed schedule, and inspectable in the Console under Developers → Webhooks.

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:
  • url must be HTTPS and cannot carry credentials or fragments.
  • eventTypes is 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 signing secret is the only proof that a delivery came from Kordless. If you lose it, rotate it (POST /v1/webhook-endpoints/{id}/secret-rotation) — it cannot be recovered.

The delivery envelope

Every delivery is a POST 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

The v1 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.
With the SDK:
With raw node:crypto (no SDK):
The header may carry multiple 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 any 2xx 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 created if 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.