Webhooks let your systems react to events happening inside Agent Handler - a Registered User is created, a tool call fails, a security rule fires, an OAuth token expires. Agent Handler signs every outbound webhook and retries on failure, so your endpoint can stay simple.
Outbound webhooks are events from Agent Handler to you - the common case. Inbound webhooks are events from a third party (Slack, Jira) to Agent Handler, then forwarded to your outbound webhook so you get one unified event stream.
Your endpoint should accept POST requests, parse JSON, and return 2xx on success. Anything non-2xx triggers a retry.
For local development, webhook.site gives you a temporary URL that captures requests in a browser. Once you’ve confirmed payloads look right, point at your real endpoint.
All payloads share the same envelope. The data field’s shape varies by event type.
Sensitive values follow the same redaction rules as the Tool Call Logs - anything the Security Gateway redacted on the original call is also redacted in the webhook payload.
Every outbound webhook is signed with HMAC-SHA256 using a secret you control. The signature is in the X-Merge-Signature header. Verify it before trusting the payload - anyone can POST to a public URL.
Get your signing secret at Webhooks → Verification key. Rotate it from the same page; rotation invalidates all signatures generated with the old key.
Verify against the raw request body. If your framework parses JSON before you see the bytes, configure it to give you the raw body - re-stringifying parsed JSON will produce a different signature.
Agent Handler waits up to 10 seconds for a 2xx response. Slower than that or non-2xx triggers a retry. Retry schedule is exponential backoff with jitter:
After five failures, the event is dropped. You can replay individual events from the dashboard’s webhook delivery log.
For long-running work, return 2xx immediately and process asynchronously. Holding the connection open past 10 seconds will burn retries even if your work eventually succeeds.
The id field on the envelope is unique per event. Use it as your idempotency key - if you’ve already processed an event with that ID, drop the duplicate. Retries reuse the same ID, so dedupe is mechanical.
Some Connectors (Slack, Jira, GitHub) emit webhooks to subscribers. Agent Handler can be that subscriber, then forward the event to your outbound webhook. You get a single, unified event stream regardless of how many third parties you’re reacting to.
Inbound webhooks are passthrough only - every inbound subscription must be paired with an outbound subscription that includes inbound_webhook.received.
inbound_webhook.received. Add the event to an existing outbound subscription (or create a new one) at Connectors → Webhooks.Each Connector’s webhook setup is documented inline in the dashboard. The Slack flow, as a representative example:
inbound_webhook.received payloads.The forwarded payload preserves the third party’s original event under a data.original_event field, plus metadata about which Connector and which Registered User the event belongs to:
Tag tool calls with session or workflow metadata using Custom headers for MCP.