📘 Public beta · Endpoints are stable; OpenAPI specs and SDKs ship monthly. See changelog →
Products
AI Automation
Webhooks

AI Automation · Webhooks

See Webhooks (global) → for signing, retry, idempotency.

Event catalog

EventFires whendata keys
flow.run.startedRun transitions from pending to runningrunId · flowId · flowSlug · trigger · input
flow.run.succeededRun completed successfullyrunId · flowSlug · status · finishedAt · steps[]
flow.run.failedRun failedrunId · flowSlug · failedStepId · errorMessage
flow.run.awaiting_approvalRun paused at a human_approval noderunId · stepId · actionLabel · proposedAction
generation.startedAn llm_step started inferencerunId · stepId · model
generation.completedAn llm_step completedrunId · stepId · tokens · inferenceMs
generation.failedAn llm_step failed (after retries)runId · stepId · errorMessage
conversation.startedNew conversation createdconversationId · agentId · context
conversation.messageAny message posted to a conversationconversationId · messageId · role · content
conversation.completedConversation marked closedconversationId
agent.tool_calledAn assistant message requested a tool callconversationId · messageId · toolCallId · slug · input
eval.completedAn eval suite completed (advanced feature)evalId · passRate · summary
incident.firedAn automation-detected incident firedincidentId · severity · summary
incident.refiredSame incident fired again within suppression windowincidentId · count
incident.acknowledgedSomeone acked an incidentincidentId · actorUserId · note
incident.resolvedIncident resolvedincidentId · resolvedBy · resolution
incident.escalatedIncident escalated to next tierincidentId · escalatedTo
incident.auto_resolvedSelf-resolved without actionincidentId
digest.deliveredScheduled digest delivereddigestId · channel
digest.failedDigest delivery faileddigestId · error
webhook.testTest eventsource: "test"

Example: flow.run.succeeded

{
  "id": "evt_01HXY...",
  "event": "flow.run.succeeded",
  "occurredAt": "...",
  "orgId": "...",
  "data": {
    "runId": "run_01HXY...",
    "flowId": "flw_01HXY...",
    "flowSlug": "ticket-triage-v1",
    "status": "succeeded",
    "trigger": "webhook",
    "finishedAt": "...",
    "steps": [
      { "nodeId": "classify", "type": "llm_step", "output": { "parsed": { "category": "...", "urgency": 5 }, "model": "quantum-ai:default", "inferenceMs": 1250 } },
      { "nodeId": "page_oncall", "type": "http_sink", "output": { "statusCode": 200 } }
    ]
  }
}

Example: agent.tool_called

{
  "id": "evt_01HXY...",
  "event": "agent.tool_called",
  "occurredAt": "...",
  "orgId": "...",
  "data": {
    "conversationId": "cnv_01HXY...",
    "messageId": "msg_01HXY...",
    "toolCallId": "tc_01HXY...",
    "slug": "list_recent_transactions",
    "input": { "customerId": "cus_01HXY...", "limit": 30 }
  }
}

Your service receives this, executes the tool, posts the result back via POST /api/conversations/{id}/messages with role: tool.

Register

POST/api/webhooks
Auth · API keyScope · webhooks:write
{
  "url": "https://your-app.example.com/webhooks/ai-automation",
  "events": ["flow.run.succeeded", "flow.run.failed", "agent.tool_called"],
  "silenceWindowSec": 60,
  "dedupKey": "${data.runId}"
}

Per-subscription dedupe + silence

AI Automation webhook subscriptions support:

FieldPurpose
silenceWindowSecSuppress duplicate events with the same dedupKey within this window (0–86400 sec).
dedupKeyTemplate over data — events with the same evaluated key collapse.

Use for noisy events like conversation.message where you'd rather get one event per conversation per minute than per message.

Auth header

Same as Orchestration — Bearer secret in Authorization:

Authorization:       Bearer qe_whsec_...
X-Quantum-Event:     flow.run.succeeded
X-Quantum-Delivery:  whd_01HXY...