Webhook Events
A webhook subscription listens for one of the nine events on this page. Each section says precisely what fires the event and what looks as if it should but does not, then gives the body CheckFlow posts. Subscribing, delivery, retries and signature verification are the same for every event and are described once, on Webhooks.
| Event | Fires when | Scopes | Payload |
|---|---|---|---|
new_checklist | A checklist is started from a template. | Template | Checklist |
task_completed | A task is completed. | Task, Template, Workspace | Task |
file_uploaded | A file is uploaded to a File Upload control. | Field | File |
checklist_completed | A checklist becomes complete. | Template, Workspace | Checklist |
comment_created | A comment is written on a task. | Task, Workspace | Comment |
task_assigned | A task is given to somebody who did not have it. | Task, Template, Workspace | Assignment |
data_set.record.created | A Data Set record is added. | Workspace | Data Set record |
data_set.record.updated | A Data Set record's values change. | Workspace | Data Set record |
data_set.record.deleted | A Data Set record is deleted. | Workspace | Data Set record |
A v2 subscription and a v3 subscription to the same event receive the same body: the payload is built once per event and posted to every matching subscription. The only difference is the CF-Signature header, which a subscription without a secret does not get.
Reading a Payload
The payloads come in two families, and they are formatted differently:
new_checklist,task_completed,file_uploadedandchecklist_completedsend the checklist, task and file shapes the v2 API has always sent. They are indented JSON, with property names prefixed by the object they belong to (checklistName,taskKey), and they contain noeventTypeproperty. Their timestamps are UTC written with an offset, such as2026-09-15T09:40:12+00:00. A property with no value is sent asnull, not left out.comment_created,task_assignedand the three Data Set events are single-line JSON that starts with aneventTypeproperty. A property with no value is sent asnull.
Both families are written with JSON escaping of characters outside ASCII and of HTML-sensitive characters: an em dash arrives as —, & as &, < and > as < and >, a double quote inside a string as ". Any JSON parser turns these back into the characters, but the escaped form is what the signature was computed over, so verify the raw bytes before parsing. The examples on this page show the payloads exactly as sent, except that single-line payloads are shown indented for reading.
This page does not follow the rest of the v3 API's conventions — camelCase names without prefixes, keys rather than numeric ids, timestamps ending in Z, absent rather than null — because the four older payloads cannot change without breaking the receivers built on them. Read a payload as a notification and use the keys in it with the v3 routes, such as GET /v3/checklists/{key}, when you need the full, current picture.
Shared Payload Objects
The Checklist Payload
new_checklist and checklist_completed send the whole checklist, with every task on it and each task's fields and comments.
| Field | Type | Description |
|---|---|---|
checklistId | integer | The checklist's numeric id. |
checklistKey | string (GUID) | The checklist's key — the one the v3 checklist routes take. |
checklistName | string | The checklist's name. |
checklistUrl | string | The checklist's page in the app. |
checklistScheduledDateTime | string or null | When a scheduled checklist was scheduled for; null otherwise. |
checklistStartDateTime | string or null | When the checklist was started. |
checklistEndDateTime | string or null | When the checklist was completed; null while it is open. |
checklistCreatedByName | string | Who started it. CheckFlow Scheduler for a checklist started by a schedule. |
checklistCreatedByEmail | string | Their email address. support@checkflow.io for a scheduled checklist. |
checklistIsShared | boolean | Whether the checklist is shared by link. |
checklistSharedUrl | string or null | The share link, or null when there is none. |
checklistIsArchived | boolean | Whether the checklist is archived. |
template | Template | The template it was started from. |
tasks | array of Checklist Task | Every task on the checklist, in order, headings included. |
Each entry in tasks:
| Field | Type | Description |
|---|---|---|
taskId | integer | The task's numeric id on this checklist. |
taskKey | string (GUID) | The task's key. This is the template task's key, so it is the same on every checklist started from the template — see Scope Keys Are Template Keys. |
taskName | string | The task's name. |
taskIsHeading | boolean | Whether the entry is a heading rather than a task. |
taskIsCurrentlyHalted | boolean | Whether the task is waiting on an earlier task. |
taskIsCurrentlyHidden | boolean | Whether conditional logic currently hides the task. |
taskDueDateTime | string or null | The task's due date. |
taskCompletedDateTime | string or null | When it was completed or marked Not Applicable. |
taskCompletedByName | string or null | Who completed it. |
taskCompletedByEmail | string or null | Their email address. |
assignees | array of Assignee | Who the task is assigned to. |
fields | array | The task's input controls and their values — see Fields in a Payload. |
comments | array of Comment | The comments on the task. |
A task on the checklist payload has no taskUrl and no tags; the Task Payload has both.
The Task Payload
task_completed sends one task, with its checklist and template.
| Field | Type | Description |
|---|---|---|
taskId | integer | The task's numeric id. |
taskKey | string (GUID) | The task's key — the template task's key for a checklist task, the task's own key for a standalone task. |
taskName | string | The task's name. |
taskUrl | string | The task in the app: its place on its checklist, or, for a standalone task that is not attached to a checklist, the task in the Tasks grid. |
taskIsHeading | boolean | Whether the task is a heading. |
taskIsCurrentlyHalted | boolean | Whether the task is waiting on an earlier task. |
taskIsCurrentlyHidden | boolean | Whether conditional logic currently hides the task. |
taskDueDateTime | string or null | The task's due date. |
taskCompletedDateTime | string or null | When it was completed. |
taskCompletedByName | string or null | Who completed it. |
taskCompletedByEmail | string or null | Their email address. |
assignees | array of Assignee | Who the task is assigned to. |
fields | array | The task's input controls and their values — see Fields in a Payload. |
comments | array of Comment | The comments on the task. |
tags | array of Tag | The task's tags. |
checklist | Checklist Summary | The checklist the task is on. |
template | Template | The checklist's template. |
A standalone task that is not attached to a checklist still has checklist and template objects, with every property present and empty: checklistId and templateId are 0, templateVersion is 0, checklistIsShared is false, and everything else is null. Test checklist.checklistKey for null to tell the two cases apart. A standalone task attached to a checklist reports that checklist and its template.
The Checklist Summary Object
The checklist object inside the task and file payloads. It has the first eleven properties of the Checklist Payload — checklistId to checklistSharedUrl — and not checklistIsArchived, template or tasks; the template is a sibling object instead.
The Template Object
| Field | Type | Description |
|---|---|---|
templateId | integer | The template's numeric id. |
templateKey | string (GUID) | The template's key — the one a Template scope names. |
templateName | string | The template's name. |
templateUrl | string | The template's page in the app. |
templateDescription | string | The template's description. |
templateVersion | integer | The template version the checklist was started from. |
templateCreatedDateTime | string | When that template version was created. |
The Assignee Object
| Field | Type | Description |
|---|---|---|
assigneeId | integer | The member's or group's id — the same ids as Members and Groups. |
assigneeType | string | TeamMember or Group. |
assigneeName | string | The member's or group's name. |
The Comment Object
| Field | Type | Description |
|---|---|---|
commentID | integer | The comment's id. Note the capital ID. |
commentHtml | string | The comment as HTML, as it was typed. |
commentDateTime | string | When it was written. |
The Tag Object
| Field | Type | Description |
|---|---|---|
tagKey | string | The tag's key. |
tagName | string | The tag's name. |
assignmentKey | string | The key of what the tag is on. |
assignmentType | string | Task. |
parentKey | string or null | A related key, or null. |
Fields in a Payload
Fields are the task's input controls (see Control Types). In these four payloads each field is an object with a single property, and the property's name is built from the control's type and its label: the type name below, an underscore, then the label, both lower-cased with spaces replaced by underscores. A Short Text control labelled Invoice Number becomes short_text_invoice_number. An unlabelled control is named from Unlabelled <type> Content at Position <n> in the same way.
| Control | Property name starts | Value |
|---|---|---|
| Short Text | short_text_ | The text, or null. |
| Long Text | long_text_ | The text, or null. |
email_input_ | The address, or null. | |
| Website | website_ | The URL, or null. |
| Date & Time | date_ | The date, or null. In the task payload it has an offset (2026-09-12T00:00:00+00:00); in the checklist payload it has none (2026-09-12T00:00:00). |
| Drop-Down | drop_down_ | The selected option's text, or null. |
| Multi-Choice | multi_choice_drop_down_ | An array with one object per option, each holding one property — the field's name, _, and the option's text in the same form — set to true or false. |
| Sub-Tasks | sub_tasks_ | An array with one object per sub-task, named in the same way as Multi-Choice options, set to whether it is ticked. |
| File Upload | file_ | An array with one object per uploaded file, holding <name>_file_<n>_name, <name>_file_<n>_content_type and <name>_file_<n>_url, where <n> counts from 0. |
| File | file_upload_ | The same array, for the files attached in the template. |
| Table | table_ | An array with one object per filled cell: rowIndex, columnIndex (both from 1), value and isReadOnly. |
| Mail To |