Skip to main content
Webhooks notify external systems after Harly records a domain change. Delivery is durable and at-least-once: your receiver must be idempotent.

Create an endpoint

  1. Open Settings → Developers → Webhooks.
  2. Enter an HTTPS endpoint and select event types.
  3. Store the signing secret — it begins with whsec_ — in your secret manager.
  4. Send a test delivery and confirm a 2xx response.
Harly blocks loopback, private, link-local, and metadata destinations by default. For a controlled internal deployment, an owner may set HARLY_ALLOW_PRIVATE_WEBHOOKS=true.

Verify the signature

Every delivery includes an x-harly-signature-256 header with the format:
The HMAC-SHA256 is computed over ${t}.${rawBody} keyed by the endpoint secret. The timestamp lets receivers reject replayed deliveries (Harly’s default tolerance window is 5 minutes). Always verify the raw request body before parsing JSON.

Receiver contract

  • Return 2xx after durable acceptance, not after completing a slow workflow.
  • Deduplicate by event.id — delivery is at-least-once.
  • Persist the event before enqueueing downstream work.
  • Treat unknown event types as accepted and observable.
  • Return 4xx for an invalid signature, 5xx for a transient failure.

Event types

Delivery and retries

Failed deliveries are retried by the scheduler with exponential backoff: After 6 failed attempts, the delivery is marked permanently failed. Owners can inspect delivery attempts and use Replay from the delivery history after correcting the receiver.

Secret format

Webhook secrets generated by Harly begin with whsec_ and contain 32 bytes of cryptographically random data encoded as base64url. Rotate the secret by deleting and recreating the endpoint.
Webhooks are for durable external reactions. For browser UI updates inside a Harly workspace, use realtime events.