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:- Finds every active webhook subscribed to that
type+actionpair - Builds a versioned JSON envelope (see Payload format)
- Signs the raw body and attaches auth headers
- POSTs to your URL with up to 3 retry attempts on failure
- Records every attempt in delivery logs for debugging
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.
Verify the HMAC signature
The signature header value is prefixed withsha256=. 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 theKarzoun-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 withwebhooksAdd. 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.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
Event catalog
Events are identified by atype (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
webhooksPingand check for asystem.pingdelivery with statussuccess - 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
- GraphQL API reference — search for
Webhook,WebhookDeliveryLog - Authentication — app tokens for GraphQL access
- Errors — interpreting GraphQL and HTTP error responses