Skip to main content

Tasks Grid

The /v3/my-work routes are the API side of the Tasks grid. GET /v3/my-work is the only v3 route that lists tasks without being told which checklist to look in: it returns checklist tasks and standalone tasks together, across every checklist the acting member can see. The same resource lets you snooze a selection of those tasks in one call and manage the saved views people pick from on the Tasks screen.

Everything here is about a person. Which checklists are in scope, which tasks are hidden by a snooze, whether a row counts as assigned to "me", which saved views exist and which one opens by default — all of these depend on who is asking. So every route on this page acts for the member the API key acts as, and a key that acts as the workspace is refused with 403 and the code API_KEY_ACTS_AS_WORKSPACE (the error's field is X-API-KEY). A workspace key would otherwise be answered with the grid of the workspace's anonymous member, which reads exactly like an empty workspace. Use a key that acts as a member — see Routes That Need a Person.

Every write on this page accepts an Idempotency-Key header — see Idempotency.

Endpoints​

MethodPathDescriptionMCP tool
GET/v3/my-workList worklist_my_work
POST/v3/my-work/snoozeSnooze taskssnooze_tasks
DELETE/v3/my-work/snoozeEnd snoozesend_snooze_tasks
GET/v3/my-work/viewsList saved viewslist_my_work_views
GET/v3/my-work/views/{viewKey}Get a saved view—
POST/v3/my-work/viewsSave a viewcreate_my_work_view
PUT/v3/my-work/views/{viewKey}Replace a saved viewupdate_my_work_view
DELETE/v3/my-work/views/{viewKey}Delete a saved viewdelete_my_work_view

The Work Item Object​

One row of the Tasks grid. It says where the task lives and enough of its state to decide what to do next; it does not carry the task's fields or comments. Read the task itself for those.

FieldTypeDescription
keystring (GUID)The task's key. Unique on its own only for a standalone task — see Addressing a Row.
namestringThe task's name.
statusstringWhere the task stands, from the actor's point of view. One of the values in Task Statuses.
isStandalonebooleantrue for a standalone task, attached to a checklist or not. Decides which routes act on the task.
dueDateTimestringWhen the task is due. Absent when it has no due date.
completedDateTimestringWhen the task was completed. Absent when it is not complete.
notApplicableDateTimestringWhen the task was marked not applicable. Absent otherwise.
snoozedUntilDateTimestringWhen the actor's own snooze on this task runs out. Absent when the actor has not snoozed it. A date in the past is a snooze that has already run out.
assigneesarrayEvery member and group the task is assigned to, each { "id", "type", "name" }, groups first and then members, each by name. An assignee who has since left the workspace keeps their entry with no name.
isAssignedExclusivelybooleantrue when only the assignees may open, change or reassign the task. Every standalone task is exclusive.
isAssignedToActorbooleantrue when the actor is an assignee, directly or through a group. Always true for an Administrator — see the warning below.
canActorAccessbooleanfalse only for a task assigned exclusively to somebody else. Such a task is listed, but every write route refuses it. Always true for an Administrator.
tagsarray of stringThe task's tags, by name, in name order.
commentCountintegerHow many comments the task has.
checklistobjectThe checklist the task belongs to or is attached to: key, name, url and template (key, name, url and the version the checklist was run from). Absent for a standalone task attached to nothing.
urlstringWhere a person works on the task in the app: the checklist page for a checklist task, or the Tasks grid opened on the task for a standalone task.
{
"key": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"name": "Check PO number matches",
"status": "Overdue",
"isStandalone": false,
"dueDateTime": "2026-09-25T17:00:00Z",
"assignees": [
{ "id": 12, "type": "Group", "name": "Finance Team" },
{ "id": 1044, "type": "TeamMember", "name": "Priya Patel" }
],
"isAssignedExclusively": false,
"isAssignedToActor": true,
"canActorAccess": true,
"tags": ["urgent"],
"commentCount": 2,
"checklist": {
"key": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"name": "Invoice Review — INV-2041",
"url": "https://app.checkflow.io/Checklist/Index?checklistKey=5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"template": {
"key": "3f2b8c1e-7a4d-4e5b-9c61-2d8f0a7b6e14",
"name": "Invoice Review",
"url": "https://app.checkflow.io/Template/Index?templateKey=3f2b8c1e-7a4d-4e5b-9c61-2d8f0a7b6e14",
"version": 3
}
},
"url": "https://app.checkflow.io/Checklist/Index?checklistKey=5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15"
}
warning

isAssignedToActor answers "may this person work on it", not "is this person an assignee". For an Administrator it is true on every row, assigned or not. Read assignees when you need to know who the task is actually assigned to.

A tag whose name contains a vertical bar (|) comes back split into two entries in tags.

Task Statuses​

A task has exactly one status on this route. The statuses are worked out in this order, and the first that applies wins — so a task you have snoozed that is also overdue reads Snoozed.

StatusMeaning
HaltedThe task is held back by a halt task earlier in the checklist. See Enforce Task Order.
SnoozedYou have snoozed the task and the snooze has not run out. Only the actor's own snooze counts.
NotApplicableThe task has been marked not applicable.
CompleteThe task has been completed.
OverdueOpen, and its due date has passed.
DueTodayOpen, and due between now and the end of today.
DueInFutureOpen, and due after the end of today.
IncompleteOpen, with no due date.

"Today" ends at midnight in the time zone named by the request's X-CF-Timezone header or, when there is none, in the acting member's own time zone. See Time Zones.

These are the same strings the status filter takes, so a status read off a row can be sent straight back.

Addressing a Row​

A checklist copies its tasks from its template, and their keys with them, so the same task key appears once in every checklist run from that template. To act on a row:

When isStandalone isUseNamed by
falseChecklist Tasks routes, /v3/checklists/{checklistKey}/tasks/{taskKey}checklist.key and key
trueStandalone Tasks routes, /v3/tasks/{taskKey}key

The bulk snooze routes on this page take the same pair.

List Work​

Returns a page of tasks from every checklist the actor can see, plus standalone tasks. With no parameters it returns the actor's own open work, soonest due first: tasks assigned to the actor whose status is Incomplete, DueInFuture, DueToday or Overdue, standalone tasks included. That is the My Open Tasks view the app opens on.

GET /v3/my-work

Parameters​

NameInTypeRequiredDescription
statusquerystringNoComma-separated statuses to include, or all. Default Incomplete,DueInFuture,DueToday,Overdue. Matching ignores case, spaces, hyphens and underscores, so not applicable and due_today work. An unknown status, Hidden included, is refused, and so is an empty value.
assigneequerystringNoWhose tasks, comma-separated: me (default), unassigned, TeamMember:1043, Group:12 — or all on its own, which includes unassigned tasks. A member matches tasks assigned to them directly or through a group they are in. A bare id such as 1043 is refused, because a member and a group can share an id.
templatequerystringNoComma-separated template keys. Omit for every template. Narrows checklist tasks only; standalone tasks belong to no template and follow includeStandalone.
checklistquerystringNoComma-separated checklist keys. Omit for every checklist.
includeStandalonequerybooleanNoInclude standalone tasks. Default true. Any value other than true or false is refused.
sortquerystringNodueDateTime, name, checklistName, templateName or commentCount, optionally with :asc or :desc. Default dueDateTime:asc.
pageSizequeryintegerNoResults per page, 1–100. Default 50. A value outside that range is treated as 50.
afterquerystringNoThe nextCursor from the previous page. Send the same filters, sort and pageSize with it.

See Pagination for how cursors work.

Example​

A key acting as Priya Patel asks for everything overdue or due today across the workspace:

GET https://api.checkflow.io/v3/my-work?status=Overdue,DueToday&assignee=all&pageSize=2
X-API-KEY: your-api-key-here
HTTP/1.1 200 OK
{
"items": [
{
"key": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"name": "Check PO number matches",
"status": "Overdue",
"isStandalone": false,
"dueDateTime": "2026-09-25T17:00:00Z",
"assignees": [
{ "id": 12, "type": "Group", "name": "Finance Team" },
{ "id": 1044, "type": "TeamMember", "name": "Priya Patel" }
],
"isAssignedExclusively": false,
"isAssignedToActor": true,
"canActorAccess": true,
"tags": ["urgent"],
"commentCount": 2,
"checklist": {
"key": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"name": "Invoice Review — INV-2041",
"url": "https://app.checkflow.io/Checklist/Index?checklistKey=5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"template": {
"key": "3f2b8c1e-7a4d-4e5b-9c61-2d8f0a7b6e14",
"name": "Invoice Review",
"url": "https://app.checkflow.io/Template/Index?templateKey=3f2b8c1e-7a4d-4e5b-9c61-2d8f0a7b6e14",
"version": 3
}
},
"url": "https://app.checkflow.io/Checklist/Index?checklistKey=5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15"
},
{
"key": "9b4f1e6c-3a8d-4f2b-a7e5-1c0d8b3f6e92",
"name": "Chase supplier for W-9",
"status": "DueToday",
"isStandalone": true,
"dueDateTime": "2026-09-27T16:00:00Z",
"assignees": [
{ "id": 1043, "type": "TeamMember", "name": "James Okafor" }
],
"isAssignedExclusively": true,
"isAssignedToActor": false,
"canActorAccess": false,
"tags": [],
"commentCount": 0,
"url": "https://app.checkflow.io/Work?taskKey=9b4f1e6c-3a8d-4f2b-a7e5-1c0d8b3f6e92"
}
],
"nextCursor": "eyJ2IjoxLCJzIjoiZHVlRGF0ZVRpbWU6YXNjIiwibyI6Mn0",
"hasMore": true,
"total": 17
}

The second row is James's exclusive standalone task. Priya can see it because assignee=all lists it, but canActorAccess is false, so any write to it would be refused.

Responses​

StatusCodeWhen
200—The page of work. total is the number of tasks that match.
400VALIDATION_ERRORfield names the problem: status (unknown or empty), assignee (unreadable, empty or all combined with anything), template or checklist (a key that is not a GUID, or an empty list), includeStandalone (not true or false), sort (an unknown field) or after (a cursor that cannot be read or was issued for a different query).
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.

Notes​

  • Widening assignee does not widen what the actor may see. assignee=all lists everybody's tasks on the checklists the acting member is permitted to see; two members sending the same request can get different lists. An Administrator sees every checklist.
  • me means assigned to the actor, even for an Administrator. Being an Administrator changes what you can see, not what is assigned to you.
  • Snoozed and halted tasks are not in the default list. A task you have snoozed is listed only when Snoozed is among the statuses you ask for (status=all includes it), and reads Snoozed. Another member's snooze has no effect on your list.
  • Sorting. A task with no due date sorts last on dueDateTime in both directions. Text sorts ignore case. Tasks that tie are ordered by an internal row id, so the order is stable and a cursor never shows the same task twice. The grid's status, assignees and tags sorts are not available here.
  • Cursors belong to the actor. A cursor also encodes the actor and their time zone, so a cursor issued to one member, or under a different X-CF-Timezone, is refused with 400 on after.

The Snooze Result Object​

Both snooze routes answer with this object. Every task named in the request is in it — a request that cannot act on every task is refused as a whole — so there is no per-task outcome to check.

FieldTypeDescription
snoozedUntilstringWhen the snooze runs out, in UTC, as stored. Absent in the answer to End snoozes.
tasksarrayThe tasks acted on, in the order they were named, each task once.
tasks[].keystring (GUID)The task's key.
tasks[].checklistKeystring (GUID)The checklist the task was named with. Absent when the task was named without one.
tasks[].namestringThe task's name.
tasks[].isStandalonebooleanWhether the task is a standalone task, which decides where it is acted on individually.
tasks[].isSnoozedbooleantrue on every task after a snooze, false on every task after ending snoozes.
{
"snoozedUntil": "2026-10-05T08:00:00Z",
"tasks": [
{
"key": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"name": "Check PO number matches",
"isStandalone": false,
"isSnoozed": true
}
]
}

Snooze Tasks​

Hides a set of tasks from the acting member's own Tasks grid until a date. This is the API form of snoozing several rows at once from the grid's bulk actions; to snooze a single task you can also use the per-task snooze routes on Checklist Tasks and Standalone Tasks.

POST /v3/my-work/snooze

Parameters​

This endpoint takes no parameters.

Request Body​

{
"snoozedUntil": "2026-10-05T08:00:00Z",
"tasks": [
{
"taskKey": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15"
},
{
"taskKey": "4d1c8f3e-9a2b-4e7d-b5f0-6c3a1e9d2b84"
}
]
}
FieldTypeRequiredDescription
snoozedUntilstringYesWhen the snooze runs out. Must be in the future. A date without an offset is read as UTC. One date applies to every task in the call.
tasksarrayYesThe tasks to snooze, 1 to 200.
tasks[].taskKeystring (GUID)YesThe task's key — a row's key.
tasks[].checklistKeystring (GUID)DependsThe checklist the task is in or attached to — a row's checklist.key. Required for a checklist task. Leave it out only for a standalone task; an attached standalone task can be named with or without it.

Copy both halves off each List work row and the reference is always right. Naming the same task twice is not an error; it is acted on and reported once.

Example​

POST https://api.checkflow.io/v3/my-work/snooze
X-API-KEY: your-api-key-here
Content-Type: application/json

{
"snoozedUntil": "2026-10-05T08:00:00Z",
"tasks": [
{
"taskKey": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15"
},
{
"taskKey": "4d1c8f3e-9a2b-4e7d-b5f0-6c3a1e9d2b84"
}
]
}
HTTP/1.1 200 OK
{
"snoozedUntil": "2026-10-05T08:00:00Z",
"tasks": [
{
"key": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"name": "Check PO number matches",
"isStandalone": false,
"isSnoozed": true
},
{
"key": "4d1c8f3e-9a2b-4e7d-b5f0-6c3a1e9d2b84",
"name": "Renew insurance certificate",
"isStandalone": true,
"isSnoozed": true
}
]
}

Responses​

StatusCodeWhen
200—Every task named is now snoozed for the actor.
400VALIDATION_ERRORfield is snoozedUntil (missing, or not in the future); tasks (none named, more than 200, or one of them is a heading); tasks[n].taskKey (missing or not a GUID); or tasks[n].checklistKey (not a GUID). A snoozedUntil that is not a date makes the body unreadable, answered Invalid request body with no field.
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace. A snooze belongs to a person.
404TASK_NOT_FOUNDA task key names no task in this workspace, or not in the checklist it was named with.

Notes​

  • All or nothing. If any task cannot be resolved, nothing is snoozed, and the error names the first entry at fault by its position.
  • Nobody else is affected. No activity entry is recorded, no notification is sent and no webhook fires. The tasks go on appearing on everybody else's grid.
  • Snoozing hides; it does not change the due date. Snoozing tasks that are already snoozed stores the new date.
  • A missing snoozedUntil is reported before any task is looked up, even when the task list is also wrong.

End Snoozes​

Brings a set of tasks back into the acting member's Tasks grid now.

DELETE /v3/my-work/snooze

This DELETE takes a request body, because the tasks are named the same way as when snoozing them and a list of pairs does not fit in a URL. If your HTTP client cannot send a body with DELETE, snooze the same tasks until a date in the near future instead.

Parameters​

This endpoint takes no parameters.

Request Body​

{
"tasks": [
{
"taskKey": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15"
}
]
}
FieldTypeRequiredDescription
tasksarrayYesThe tasks to bring back, 1 to 200, each named as for Snooze tasks.
tasks[].taskKeystring (GUID)YesThe task's key.
tasks[].checklistKeystring (GUID)DependsThe task's checklist, as for Snooze tasks.

Example​

DELETE https://api.checkflow.io/v3/my-work/snooze
X-API-KEY: your-api-key-here
Content-Type: application/json

{
"tasks": [
{
"taskKey": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15"
}
]
}
HTTP/1.1 200 OK
{
"tasks": [
{
"key": "e2a7c4b9-1d3f-4e8a-9b5c-7f0d6a2e8c31",
"checklistKey": "5d8e2f1a-4c7b-49e3-8a6d-0b3f9c2e7a15",
"name": "Check PO number matches",
"isStandalone": false,
"isSnoozed": false
}
]
}

Responses​

StatusCodeWhen
200—None of the tasks named is snoozed for the actor any more.
400VALIDATION_ERRORfield is tasks (none named, more than 200, or one of them is a heading), tasks[n].taskKey or tasks[n].checklistKey.
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.
404TASK_NOT_FOUNDA task key names no task in this workspace, or not in the checklist it was named with.

Notes​

A task that was not snoozed, or whose snooze had already run out, is left as it is and the call still answers 200 — so you can end snoozes on a mixed selection without sorting it first. Nothing is recorded or announced.

The Saved View Object​

A saved view is a List work query written down and given a name. Its fields use the list route's vocabulary — the same status names, assignee pairs, template keys and sort fields — so reading a view tells you what to send to reproduce it. See Reproducing a View.

FieldTypeDescription
keystringA GUID for a saved view, or the name of a built-in view.
namestringThe view's name, as it reads in the app's view picker.
typestringPrivate (the author's alone), UsersGroups (shared with visibleTo and the author), Team (everybody in the workspace) or Core (built in).
isCorebooleantrue for the five built-in views.
isDefaultbooleantrue for the view the actor opens the Tasks grid on. Exactly one view in a list carries it.
canEditbooleanWhether the actor may replace or delete this view.
createdByintegerThe member id of whoever saved the view. Absent for a built-in view.
searchstringFree text the view filters on in the app. Absent when there is none. GET /v3/my-work has no equivalent.
statusesarray of stringThe statuses the view shows. Never empty.
allTemplatesbooleantrue when the view shows every template, including templates created after it was saved.
templatesarray of stringThe template keys the view is narrowed to. Empty when allTemplates is true. Empty with allTemplates false means the view shows no checklist tasks at all.
includeStandalonebooleanWhether standalone tasks are shown.
allAssigneesbooleantrue when the view shows everybody's tasks.
includeUnassignedbooleanWhether tasks assigned to nobody are shown.
assigneesarrayWhose tasks the view shows, each { "id", "type" } with type TeamMember or Group. Empty when allAssignees is true. A view saved with no assignees means "the member reading it", and is reported with the actor's own id.
sortstringThe view's order, as field:asc or field:desc.
visibleToarrayWho a UsersGroups view is shared with, each { "id", "type" }. Empty for every other type.
{
"key": "7c2e9a41-5d3b-4f86-a1e0-3b9d8f6c2e57",
"name": "Finance, overdue",
"type": "Private",
"isCore": false,
"isDefault": false,
"canEdit": true,
"createdBy": 1044,
"statuses": ["Overdue", "DueToday"],
"allTemplates": true,
"templates": [],
"includeStandalone": false,
"allAssignees": false,
"includeUnassigned": false,
"assignees": [
{ "id": 12, "type": "Group" },
{ "id": 1043, "type": "TeamMember" }
],
"sort": "dueDateTime:asc",
"visibleTo": []
}

Assignees in a view carry no names. Look them up with Members and Groups if you need to show them.

Built-In Views​

The five views CheckFlow ships are built by the app rather than stored. They appear first in every list, in this order, and can be read but not changed or deleted.

keyNameStatusesWhose tasks
All-OpenAll Open TasksIncomplete, DueInFuture, DueToday, OverdueEverybody, including unassigned
All-DueAll Due TasksDueInFuture, DueToday, OverdueEverybody, including unassigned
My-OpenMy Open TasksIncomplete, DueInFuture, DueToday, OverdueThe actor
My-DueMy Due TasksDueInFuture, DueToday, OverdueThe actor
SnoozedSnoozed TasksSnoozedEverybody, including unassigned

All five show every template and standalone tasks, and sort by dueDateTime:asc. See System Views.

Who Sees and Edits a View​

View typeListed toCan be replaced or deleted by
PrivateIts authorIts author, or any Administrator
UsersGroupsIts author, and the members and groups in visibleToIts author, or any Administrator
TeamEverybody in the workspaceAny Administrator — not its author, unless they are an Administrator
CoreEverybodyNobody

A group in visibleTo shares the view with whoever is in the group when the views are listed, so somebody who joins the group gains the view. canEdit on each view tells you in advance which of these applies to the actor.

List Saved Views​

Returns every view the actor can see, the five built-in views first, each with everything it filters on.

GET /v3/my-work/views

Parameters​

This endpoint takes no parameters.

Example​

GET https://api.checkflow.io/v3/my-work/views
X-API-KEY: your-api-key-here
HTTP/1.1 200 OK

The body is a JSON array rather than a paged list. Two of the five built-in views are shown here for brevity.

[
{
"key": "All-Open",
"name": "All Open Tasks",
"type": "Core",
"isCore": true,
"isDefault": false,
"canEdit": false,
"statuses": ["Incomplete", "DueInFuture", "DueToday", "Overdue"],
"allTemplates": true,
"templates": [],
"includeStandalone": true,
"allAssignees": true,
"includeUnassigned": true,
"assignees": [],
"sort": "dueDateTime:asc",
"visibleTo": []
},
{
"key": "My-Open",
"name": "My Open Tasks",
"type": "Core",
"isCore": true,
"isDefault": true,
"canEdit": false,
"statuses": ["Incomplete", "DueInFuture", "DueToday", "Overdue"],
"allTemplates": true,
"templates": [],
"includeStandalone": true,
"allAssignees": false,
"includeUnassigned": false,
"assignees": [
{ "id": 1044, "type": "TeamMember" }
],
"sort": "dueDateTime:asc",
"visibleTo": []
},
{
"key": "7c2e9a41-5d3b-4f86-a1e0-3b9d8f6c2e57",
"name": "Finance, overdue",
"type": "Private",
"isCore": false,
"isDefault": false,
"canEdit": true,
"createdBy": 1044,
"statuses": ["Overdue", "DueToday"],
"allTemplates": true,
"templates": [],
"includeStandalone": false,
"allAssignees": false,
"includeUnassigned": false,
"assignees": [
{ "id": 12, "type": "Group" },
{ "id": 1043, "type": "TeamMember" }
],
"sort": "dueDateTime:asc",
"visibleTo": []
}
]

Responses​

StatusCodeWhen
200—The views the actor can see.
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.

Notes​

isDefault is reported but cannot be set through the API. The default view is a setting of the person's sign-in rather than of the workspace — somebody who belongs to two workspaces has one default across both — and it is changed in the app. When the setting names a view the actor cannot see, My-Open is reported as the default, as the app does.

Get a Saved View​

Returns one view. The list already returns every view in full, so you need this only when you hold a view key from elsewhere.

GET /v3/my-work/views/{viewKey}

Parameters​

NameInTypeRequiredDescription
viewKeypathstringYesA saved view's GUID, or a built-in view's key — All-Open, All-Due, My-Open, My-Due or Snoozed. Matched without regard to case.

Example​

GET https://api.checkflow.io/v3/my-work/views/7c2e9a41-5d3b-4f86-a1e0-3b9d8f6c2e57
X-API-KEY: your-api-key-here
HTTP/1.1 200 OK

The body is the Saved View object shown above.

Responses​

StatusCodeWhen
200—The view.
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.
404NOT_FOUNDNo view the actor can see has that key — including another member's Private view, and a key that is neither a GUID nor a built-in name.

Save a View​

Saves a new view under a name, so that it can be picked from the view list on the Tasks screen and read back here. Everything except name has a default, and the defaults are those of List work.

POST /v3/my-work/views

Parameters​

This endpoint takes no parameters.

Request Body​

{
"name": "Finance, overdue",
"statuses": ["Overdue", "DueToday"],
"assignees": [
{ "type": "Group", "name": "Finance Team" },
{ "type": "TeamMember", "id": 1043 }
],
"includeStandalone": false,
"sort": "dueDateTime:asc"
}
FieldTypeRequiredDescription
namestringYesThe view's name. Trimmed; at most 200 characters.
typestringNoPrivate (default), UsersGroups or Team. Core is refused. Anything but Private requires the actor to be an Administrator — see the note below.
searchstringNoFree text to save with the view, at most 1000 characters. Stored and returned; the app applies it, the API does not.
statusesarray of stringNoThe statuses to show, or ["all"]. Default: the four open statuses. An empty array is refused.
allTemplatesbooleanNotrue for every template. When left out it is true if templates is empty and false otherwise. true alongside a non-empty templates is refused.
templatesarray of stringNoTemplate keys to narrow the view to. Duplicates are dropped.
includeStandalonebooleanNoShow standalone tasks. Default true.
allAssigneesbooleanNotrue for everybody's tasks. Default false — and false with no assignees means the member reading the view. true alongside a non-empty assignees is refused.
includeUnassignedbooleanNoShow tasks assigned to nobody. Default false.
assigneesarrayNoWhose tasks to show. Each entry is { "type", "id" }, or { "name" } with a full name, email address or group name. Duplicates are dropped.
sortstringNoname, status, dueDateTime, checklistName, templateName, assignees, commentCount or tags, optionally with :asc or :desc. Default dueDateTime:asc.
visibleToarrayNoWho a UsersGroups view is shared with, in the same form as assignees. Refused on any other type.

Note the asymmetry between the two "all" flags. A view naming no templates shows every template, because a view narrowed to no templates would show only standalone tasks. A view naming no assignees shows the reader's own tasks, which is how the built-in "My" views work.

Example​

POST https://api.checkflow.io/v3/my-work/views
X-API-KEY: your-api-key-here
Content-Type: application/json

{
"name": "Finance, overdue",
"statuses": ["Overdue", "DueToday"],
"assignees": [
{ "type": "Group", "name": "Finance Team" },
{ "type": "TeamMember", "id": 1043 }
],
"includeStandalone": false,
"sort": "dueDateTime:asc"
}
HTTP/1.1 201 Created

The body is the new Saved View object, with the key it was given — the example above is this view.

Responses​

StatusCodeWhen
201—The view is saved.
400VALIDATION_ERRORfield is name (missing or over 200 characters), search (over 1000 characters), type (unknown, or Core), statuses (unknown status, or an empty array), templates[n] (not a GUID), allTemplates or allAssignees (true alongside a non-empty list), assignees[n] or visibleTo[n] (an entry that names nobody, or a name that matches more than one member or group), visibleTo (sent on a view that is not UsersGroups) or sort (an unknown field).
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.
403FORBIDDENA Team or UsersGroups view saved by an actor who is not an Administrator.

Notes​

note

Through the API, only an Administrator can save a shared view. The app also lets a Member with Tasks.View.Creator share views, but the API cannot read that permission, so it refuses rather than guesses. Anybody can save a Private view.

Saving the same body twice saves two views with the same name. Send an Idempotency-Key if you may retry.

A UsersGroups view with an empty visibleTo is allowed, and behaves like a Private view because its author can always see it.

Replace a Saved View​

Replaces a saved view with the one in the body, keeping its key and its author.

PUT /v3/my-work/views/{viewKey}

This is a replacement, not a partial update. Every field you leave out takes its default rather than keeping its current value, so read the view first and send back everything you want to keep.

Parameters​

NameInTypeRequiredDescription
viewKeypathstring (GUID)YesThe saved view's key.

Request Body​

The same fields as Save a view, with the same rules and defaults. name is required.

Example​

PUT https://api.checkflow.io/v3/my-work/views/7c2e9a41-5d3b-4f86-a1e0-3b9d8f6c2e57
X-API-KEY: your-api-key-here
Content-Type: application/json

{
"name": "Finance, overdue",
"statuses": ["Overdue"],
"assignees": [
{ "type": "Group", "id": 12 }
],
"includeStandalone": false,
"sort": "dueDateTime:desc"
}
HTTP/1.1 200 OK
{
"key": "7c2e9a41-5d3b-4f86-a1e0-3b9d8f6c2e57",
"name": "Finance, overdue",
"type": "Private",
"isCore": false,
"isDefault": false,
"canEdit": true,
"createdBy": 1044,
"statuses": ["Overdue"],
"allTemplates": true,
"templates": [],
"includeStandalone": false,
"allAssignees": false,
"includeUnassigned": false,
"assignees": [
{ "id": 12, "type": "Group" }
],
"sort": "dueDateTime:desc",
"visibleTo": []
}

Responses​

StatusCodeWhen
200—The view as it now reads.
400VALIDATION_ERRORAnything Save a view refuses.
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.
403FORBIDDENThe view is one of the five built-in views, the actor may not change it (see Who Sees and Edits a View), or a non-Administrator is making it shared.
404NOT_FOUNDNo saved view the actor can see has that key.

Notes​

An Administrator who replaces somebody else's view does not become its author, so a Private view stays on its author's list.

Delete a Saved View​

Deletes a saved view. No task, checklist or comment is affected. Anybody who had it as their default view lands on My Open Tasks next time.

DELETE /v3/my-work/views/{viewKey}

Parameters​

NameInTypeRequiredDescription
viewKeypathstring (GUID)YesThe saved view's key.

Example​

DELETE https://api.checkflow.io/v3/my-work/views/7c2e9a41-5d3b-4f86-a1e0-3b9d8f6c2e57
X-API-KEY: your-api-key-here

Responds 204 No Content with no body.

Responses​

StatusCodeWhen
204—The view is deleted.
403API_KEY_ACTS_AS_WORKSPACEThe key acts as the workspace.
403FORBIDDENThe view is one of the five built-in views, or the actor may not delete it.
404NOT_FOUNDNo saved view the actor can see has that key.
danger

Deleting a view is permanent, including for everybody it was shared with. There is no way to restore it.

Reproducing a View​

To fetch the tasks a view shows, turn its fields into List work parameters:

View fieldList work parameter
statusesstatus, comma-separated
allAssignees: trueassignee=all
assignees and includeUnassignedassignee, as TeamMember:1043,Group:12, adding unassigned when includeUnassigned is true
allTemplates: false and templatestemplate, comma-separated
includeStandaloneincludeStandalone
sortsort — except status, assignees and tags, which the list route does not sort by
searchNone. Match the text against the rows yourself, as the app does in the browser.

A view with allTemplates false and no templates shows no checklist tasks. The list route cannot express that, because leaving template out means every template.

  • The Tasks Grid — the screen these routes serve, and what each column and filter means there.
  • Snoozing Tasks — how a snooze behaves for the person who set it.
  • Tasks Grid Views — saving, sharing and choosing a default view in the app.
  • Checklist Tasks — acting on a row whose isStandalone is false.
  • Authentication — creating a key that acts as a member, which every route here needs.