Events
Every webhook event type, when it fires and what its data carries; the envelope.
Every outbound event type, from the catalog the webhooks subscribe to. A subscription lists concrete types and/or *; * covers everything except the opt-in types marked below. The payload shape of each event is in the OpenAPI document's webhooks object (one entry per type) and summarized here.
| Event | When | data |
In * |
|---|---|---|---|
run.created |
A run was started (by a member, the API, a schedule or a public kickoff form). | run; kickoff when a public form started it. |
yes |
run.updated |
A run's name, priority, labels or due date changed. | run + changes keyed by attribute (name, priority, labels, due), each { from, to }. |
yes |
run.status_changed |
A run's status changed (active / completed / on_hold / archived), by hand or automatically. | run + changes.status { from, to }. |
yes |
run.completed |
Every task is done, or the run was marked completed by hand. | run. |
yes |
run.trashed |
A run moved to Trash — on its own, or with its workflow. | run (the lite header { id, name, revision, workflow, deleted when a workflow trash cascaded) + with. |
yes |
run.restored |
A run came back from Trash — on its own, or with its workflow. | run (lite when a workflow restore cascaded) + with. |
yes |
task.ready |
A task became actionable: visible, unlocked and not done. | run + task. |
yes |
task.assigned |
A task's assignees were resolved or changed, or the task became actionable for them. | run + task + assignees. |
yes |
task.completed |
A task was completed. | run + task. |
yes |
task.uncompleted |
A done task was reopened, by hand or by a rejected approval. | run + task; by names the approval task whose rejection reopened it. |
yes |
field.updated |
A field value changed (opt-in: excluded from *; filters.field narrows it). |
run + field (the resource's field entry: key, label, type, format, value, formatted, …) + field.previous. |
no (opt-in) |
approval.requested |
An approval task became actionable for its approvers (again when a decided approval is voided by a reviewed-value change). | run + task. |
yes |
approval.decided |
An approval was approved or rejected. | run + task + approval { id, decision, comment, decided. |
yes |
comment.created |
A comment was posted on a task. | run + task + comment { id, author. |
yes |
attachment.created |
A file finished uploading to a field or a comment. | run + task + attachment { id, filename, size, mime, field. |
yes |
guest.task_viewed |
A guest first opened their task link (opt-in: excluded from *). |
run + task + guest { email, link. |
no (opt-in) |
guest.task_completed |
A guest submitted their task (fires beside task.completed, whose actor is the guest). |
run + task + guest { email, link. |
yes |
workflow.published |
A workflow version was published. | workflow { id, name } + version { id, number }. |
yes |
schedule.run_created |
A recurrence schedule started a run. | run + schedule { id, name }. |
yes |
schedule.created |
A recurrence schedule was created. | schedule — the Schedule resource, as GET / returns it. |
yes |
schedule.updated |
A schedule changed: its settings were edited, it was paused or resumed, or the system paused it. | schedule + change: settings, paused, resumed or auto_disabled (auto_disabled: the system paused it, and schedule.disabled says why). |
yes |
schedule.deleted |
A schedule was deleted. | schedule — its last state. |
yes |
rule.created |
An automation rule was created. | rule — the AutomationRule resource, as GET / returns it. |
yes |
rule.updated |
An automation rule changed: its settings were edited, it was turned on or off, or the system turned it off after repeated failures. | rule + change: settings, enabled, disabled or auto_disabled (auto_disabled: the system turned it off, and rule.disabled says why). |
yes |
rule.deleted |
An automation rule was deleted. | rule — its last state. |
yes |
webhook.created |
A webhook endpoint was created. | webhook — the Webhook resource, as GET / returns it (never the signing secret). |
yes |
webhook.updated |
A webhook endpoint changed: its settings were edited, it was enabled or disabled, its secret was rotated, or the system disabled it. | webhook + change: settings, enabled, disabled, secret_rotated or auto_disabled (auto_disabled: the system disabled it, and webhook.disabled says why). Never the secret. |
yes |
webhook.deleted |
A webhook endpoint was deleted. | webhook — its last state. |
yes |
webhook.test |
A test event sent from Settings or POST /. |
webhook { id }. |
yes |
Configuration events
schedule.created, schedule.updated, schedule.deleted, rule.created, rule.updated, rule.deleted, webhook.created, webhook.updated, webhook.deleted announce the lifecycle of your automations themselves — a webhook, schedule or automation rule created, changed or deleted — so an integration learns by webhook when one is switched off.
data.webhook/data.schedule/data.ruleis the resource exactly asGETreturns it (Webhook, Schedule, AutomationRule); a*.deletedevent carries its last state. No payload ever carries a signing secret or key material.*.updatedaddsdata.change: for a webhooksettings,enabled,disabled,secret_rotated,auto_disabled; for a schedulesettings,paused,resumed,auto_disabled; for a rulesettings,enabled,disabled,auto_disabled.auto_disabledmeans Process Cart turned it off — the resource'sdisabledReasonsays why; switching something to the state it is already in announces nothing.actoris the member (user), the API key (api, with its name), orsystemfor an automatic change.- In
*, subscribable by name like every other type; automation rules never trigger on them. A disabled or deleted webhook is not delivered to, so its owndisabled,auto_disabledandwebhook.deletedevents reach the workspace's other enabled endpoints only.
Envelope
Every delivery is one JSON object:
{
"id": "evt_7f2c1c2e-0f3a-4f0e-9d6c-2b7a4c9e1f00",
"type": "task.completed",
"timestamp": "2026-10-07T18:42:11.000Z",
"org": {
"id": "0f7c4b3e-5a2d-4e1b-8c9f-1a2b3c4d5e6f",
"slug": "acme"
},
"actor": {
"kind": "api",
"keyId": "6a1f0c2d-3b4e-4f5a-8b6c-7d8e9f0a1b2c",
"name": "Zapier"
},
"data": {
"run": {
"…": "the full Run resource"
},
"task": {
"…": "the run's task entry"
}
}
}idis also thewebhook-idheader — stable across retries and redeliveries; dedupe on it.actoris who caused the change:{ kind: "user", userId }(a member),{ kind: "guest", email },{ kind: "api", keyId, name }(an API key),{ kind: "schedule", scheduleId, name }(a recurrence schedule started the run),{ kind: "rule", ruleId, name }(an automation rule acted) or{ kind: "system" }(an automatic change), plus a displaynamefor a member when known.data.runis the full Run resource except on the cascade variants ofrun.trashed/run.restored(a workflow moved to or from Trash), which carry the lite header{ id, name, revision, workflow, deletedAt }.workflow.published,webhook.testand the configuration events carry nodata.run— route ontypefirst.- Deliveries are not ordered. Order by
data.run.revisionwhen it matters, and treat an older revision than the one you hold as stale.
See Webhooks for signatures, retries and redelivery.