Webhook events
The event catalogue: when each event fires and what its payload carries.
This page is generated from
packages/engine/src/domain/shared/events.ts by pnpm generate. Do not edit it by hand; change the source and regenerate.GET /v1/schema/events returns the same list. Every delivery body has the shape below; the fields in the table are inside data. Subscribe to "*" or to a list of types when you create an endpoint. See Receiving webhooks.
{
"id": "evt_01J9…",
"type": "enrollment.exited",
"project": "prj_01J9…",
"enrollment": "enr_01J9…",
"occurred_at": "2026-10-13T09:00:00.000Z",
"data": { "enrollment": { "id": "enr_01J9…", "seq": 7, "...": "..." }, "exit_reason": "replied", "signal": "sig_01J9…" }
}| Event | When | Payload (data) |
|---|---|---|
enrollment.created | after a successful enroll, one per contact | enrollment (id, sequence, version, contact, sender, status, mode, current_node_id, touch_count, enrolled_at, seq) |
enrollment.exited | an exit by rule (reply, meeting, opt-out, bounce, suppression) or by API | enrollment, exit_reason (replied, meeting_booked, opt_out, bounced, suppressed, manual, deleted), signal (the signal id, when one caused it), label (manual exits) |
enrollment.completed | an end node, an unwired transition, or a task completed with no next step | enrollment |
enrollment.paused | a manual pause, an out-of-office reply, or a step that failed with no failed transition | enrollment, pause_reason (manual, ooo, step_failed), paused_until |
enrollment.resumed | a manual resume or a pause whose paused_until passed | enrollment, pause_reason (the reason it had), paused_until: null |
run.done | an outreach step was sent | run (id, node_id, node_type, channel, action, status, touch_number, provider, provider_ref, branch, enrollment), enrollment |
run.skipped | a gate refused a step for good (no consent, no phone, suppressed, no channel, country not allowed, no time zone) | run, reason |
run.failed | a step ran out of retries or was stuck | run, error |
run.needs_review | the outcome of a send is unknown (an SMS that may or may not have left) | run, error |
task.created | a task node created a task for the sender | task (id, kind, title, body, link, due_at, expires_at, status, outcome, dialer, enrollment, contact, sender) |
task.expired | a task reached expires_at (the step takes no_answer) or was cancelled by an exit | task (the id only when expired by the timer; the full task when cancelled by an exit) |
signal.received | any signal was processed: reply, bounce, complaint, opt-out, meeting, call, task completion, client event | signal (id, kind, channel, source, occurred_at, attribution, attributed_run), contact (id, external_id, email, phone, first_name, last_name) |
sender.channel_status | a channel changed status (credentials_needed, restricted, back to active) | sender, channel, status |
endpoint.disabled | an endpoint failed every delivery for three days, or its secret can no longer be decrypted | endpoint (id, url, event_types, status, disabled_reason, disabled_at), reason |