Skip to main content
Karzoun webhooks deliver real-time HTTP notifications when something changes in your workspace. Register an HTTPS endpoint, pick the events you care about, and Karzoun POSTs a structured JSON payload whenever they fire — for example when a conversation is assigned, a customer is updated, or a WhatsApp flow completes. Use webhooks to sync CRM data, trigger automations in your stack, notify external systems, or feed event streams into your own analytics pipeline.
MiniApp vs tenant webhooks — This guide covers outbound webhooks (Karzoun notifies your server). For inbound provider webhooks configured inside MiniApp JSON, see MiniApps webhooks.
Where to manage webhooks — Create and inspect subscriptions in Developer → Webhooks (/developer/webhooks) or via GraphQL mutations. Search the GraphQL API reference for Webhook, webhooksAdd, and related operations.

How delivery works

When an event occurs, Karzoun:
  1. Finds every active webhook subscribed to that type + action pair
  2. Builds a versioned JSON envelope (see Payload format)
  3. Signs the raw body and attaches auth headers
  4. POSTs to your URL with up to 3 retry attempts on failure
  5. Records every attempt in delivery logs for debugging
Your endpoint should return any 2xx status within the connection timeout. Non-2xx responses and network errors trigger automatic retries with exponential backoff.

Security

Karzoun secures webhook traffic with two independent mechanisms on every delivery. Use one or both to confirm the request genuinely came from Karzoun. During a secret rotation grace period (24 hours via webhooksRotateSecret), Karzoun also sends X-Karzoun-Signature-256-Previous signed with the previous secret so you can roll over without downtime.
Always verify the token or signature before processing a payload. If neither matches, respond with 401 and discard the body.

Verify the HMAC signature

The signature header value is prefixed with sha256=. Strip that prefix, then compare the remainder to an HMAC you compute over the exact raw body bytes (not a re-serialized JSON object).

Verify the token

Compare the Karzoun-token header to the token returned when you created the webhook. This is a simple shared-secret check — pair it with HMAC verification for defense in depth.

Register a webhook

Register subscriptions with webhooksAdd. Karzoun generates a unique token and HMAC secret, validates your URL (HTTPS + SSRF checks), and sends an automatic connectivity ping.
Query webhooksGetActions to list every event your workspace can subscribe to. The catalog below reflects the current platform modules.
Try this in the GraphQL Playground.
Store credentials immediately. The token and secret are returned on creation. Use webhooksRotateSecret to roll the HMAC secret; the previous secret remains valid for 24 hours.

Other management operations

Payload format

Every delivery uses the same envelope shape (version is currently 1):
For delete events, data is normalized to { "type": "<type>", "object": { "_id": "..." } }. Connectivity pings use event: "system.ping" with a short test message in data.

Retries, timeouts, and circuit breaker

Return 2xx as soon as you have accepted the payload. Offload heavy work to a background queue — slow handlers risk timeouts and retries.
The same logical event may arrive more than once (id stays the same across retries; metadata.deliveryId changes per attempt). Design handlers to tolerate duplicates.

Event catalog

Events are identified by a type (module + resource) and action (what happened). In the delivered payload they appear as event: "<type>.<action>". Query webhooksGetActions for the live list. Subscriptions below are grouped by platform module.

Customers (core:customer)

Conversations & inbox (inbox:*)

WhatsApp (whatsapp:*)

Tasks (tasks:*)

Meetings (meetings:meeting)

Timeclock (timeclock:*)

System

Troubleshooting

Confirm Karzoun is sending events

  • Open Developer → Webhooks → Delivery logs for the subscription
  • Run webhooksPing and check for a system.ping delivery with status success
  • Temporarily point the URL to webhook.site to inspect raw requests

Check your endpoint

Validate URL requirements

  • Must be HTTPS
  • Must resolve to a public IP (private ranges and localhost are blocked for SSRF protection)
  • Must return 2xx for Karzoun to consider delivery successful

Next steps

List webhooks in the Playground: query { webhooks(page: 1, perPage: 5) { data { _id name url status isActive } } }
Last modified on August 8, 2026