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
| Method | Path | Description | MCP tool |
|---|---|---|---|
GET | /v3/my-work | List work | list_my_work |
POST | /v3/my-work/snooze | Snooze tasks | snooze_tasks |
DELETE | /v3/my-work/snooze | End snoozes | end_snooze_tasks |
GET | /v3/my-work/views | List saved views | list_my_work_views |
GET | /v3/my-work/views/{viewKey} | Get a saved view | — |
POST | /v3/my-work/views | Save a view | create_my_work_view |
PUT | /v3/my-work/views/{viewKey} | Replace a saved view | update_my_work_view |
DELETE | /v3/my-work/views/{viewKey} | Delete a saved view | delete_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.
| Field | Type | Description |
|---|---|---|
key | string (GUID) | The task's key. Unique on its own only for a standalone task — see Addressing a Row. |
name | string | The task's name. |
status | string | Where the task stands, from the actor's point of view. One of the values in Task Statuses. |
isStandalone | boolean | true for a standalone task, attached to a checklist or not. Decides which routes act on the task. |
dueDateTime | string | When the task is due. Absent when it has no due date. |
completedDateTime | string | When the task was completed. Absent when it is not complete. |
notApplicableDateTime | string | When the task was marked not applicable. Absent otherwise. |
snoozedUntilDateTime | string | When 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. |
assignees | array | Every 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. |
isAssignedExclusively | boolean | true when only the assignees may open, change or reassign the task. Every standalone task is exclusive. |
isAssignedToActor | boolean | true when the actor is an assignee, directly or through a group. Always true for an Administrator — see the warning below. |
canActorAccess | boolean | false 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. |
tags | array of string | The task's tags, by name, in name order. |
commentCount | integer | How many comments the task has. |
checklist | object | The 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. |
url | string | Where 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"
}
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.
| Status | Meaning |
|---|---|
Halted | The task is held back by a halt task earlier in the checklist. See Enforce Task Order. |
Snoozed | You have snoozed the task and the snooze has not run out. Only the actor's own snooze counts. |
NotApplicable | The task has been marked not applicable. |
Complete | The task has been completed. |
Overdue | Open, and its due date has passed. |
DueToday | Open, and due between now and the end of today. |
DueInFuture | Open, and due after the end of today. |
Incomplete | Open, 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 is | Use | Named by |
|---|---|---|
false | Checklist Tasks routes, /v3/checklists/{checklistKey}/tasks/{taskKey} | checklist.key and key |
true | Standalone 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
status | query | string | No | Comma-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. |
assignee | query | string | No | Whose 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. |
template | query | string | No | Comma-separated template keys. Omit for every template. Narrows checklist tasks only; standalone tasks belong to no template and follow includeStandalone. |
checklist | query | string | No | Comma-separated checklist keys. Omit for every checklist. |
includeStandalone | query | boolean | No | Include standalone tasks. Default true. Any value other than true or false is refused. |
sort | query | string | No | dueDateTime, name, checklistName, templateName or commentCount, optionally with :asc or :desc. Default dueDateTime:asc. |
pageSize | query | integer | No | Results per page, 1–100. Default 50. A value outside that range is treated as 50. |
after | query | string | No | The 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
| Status | Code | When |
|---|---|---|
200 | — | The page of work. total is the number of tasks that match. |
400 | VALIDATION_ERROR | field 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). |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. |
Notes
- Widening
assigneedoes not widen what the actor may see.assignee=alllists 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. memeans 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
Snoozedis among the statuses you ask for (status=allincludes it), and readsSnoozed. Another member's snooze has no effect on your list. - Sorting. A task with no due date sorts last on
dueDateTimein 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'sstatus,assigneesandtagssorts 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 with400onafter.
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.
| Field | Type | Description |
|---|---|---|
snoozedUntil | string | When the snooze runs out, in UTC, as stored. Absent in the answer to End snoozes. |
tasks | array | The tasks acted on, in the order they were named, each task once. |
tasks[].key | string (GUID) | The task's key. |
tasks[].checklistKey | string (GUID) | The checklist the task was named with. Absent when the task was named without one. |
tasks[].name | string | The task's name. |
tasks[].isStandalone | boolean | Whether the task is a standalone task, which decides where it is acted on individually. |
tasks[].isSnoozed | boolean | true 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"
}
]
}
| Field | Type | Required | Description |
|---|---|---|---|
snoozedUntil | string | Yes | When 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. |
tasks | array | Yes | The tasks to snooze, 1 to 200. |
tasks[].taskKey | string (GUID) | Yes | The task's key — a row's key. |
tasks[].checklistKey | string (GUID) | Depends | The 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
| Status | Code | When |
|---|---|---|
200 | — | Every task named is now snoozed for the actor. |
400 | VALIDATION_ERROR | field 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. |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. A snooze belongs to a person. |
404 | TASK_NOT_FOUND | A 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
snoozedUntilis 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"
}
]
}
| Field | Type | Required | Description |
|---|---|---|---|
tasks | array | Yes | The tasks to bring back, 1 to 200, each named as for Snooze tasks. |
tasks[].taskKey | string (GUID) | Yes | The task's key. |
tasks[].checklistKey | string (GUID) | Depends | The 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
| Status | Code | When |
|---|---|---|
200 | — | None of the tasks named is snoozed for the actor any more. |
400 | VALIDATION_ERROR | field is tasks (none named, more than 200, or one of them is a heading), tasks[n].taskKey or tasks[n].checklistKey. |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. |
404 | TASK_NOT_FOUND | A 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.
| Field | Type | Description |
|---|---|---|
key | string | A GUID for a saved view, or the name of a built-in view. |
name | string | The view's name, as it reads in the app's view picker. |
type | string | Private (the author's alone), UsersGroups (shared with visibleTo and the author), Team (everybody in the workspace) or Core (built in). |
isCore | boolean | true for the five built-in views. |
isDefault | boolean | true for the view the actor opens the Tasks grid on. Exactly one view in a list carries it. |
canEdit | boolean | Whether the actor may replace or delete this view. |
createdBy | integer | The member id of whoever saved the view. Absent for a built-in view. |
search | string | Free text the view filters on in the app. Absent when there is none. GET /v3/my-work has no equivalent. |
statuses | array of string | The statuses the view shows. Never empty. |
allTemplates | boolean | true when the view shows every template, including templates created after it was saved. |
templates | array of string | The 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. |
includeStandalone | boolean | Whether standalone tasks are shown. |
allAssignees | boolean | true when the view shows everybody's tasks. |
includeUnassigned | boolean | Whether tasks assigned to nobody are shown. |
assignees | array | Whose 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. |
sort | string | The view's order, as field:asc or field:desc. |
visibleTo | array | Who 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.
key | Name | Statuses | Whose tasks |
|---|---|---|---|
All-Open | All Open Tasks | Incomplete, DueInFuture, DueToday, Overdue | Everybody, including unassigned |
All-Due | All Due Tasks | DueInFuture, DueToday, Overdue | Everybody, including unassigned |
My-Open | My Open Tasks | Incomplete, DueInFuture, DueToday, Overdue | The actor |
My-Due | My Due Tasks | DueInFuture, DueToday, Overdue | The actor |
Snoozed | Snoozed Tasks | Snoozed | Everybody, 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 type | Listed to | Can be replaced or deleted by |
|---|---|---|
Private | Its author | Its author, or any Administrator |
UsersGroups | Its author, and the members and groups in visibleTo | Its author, or any Administrator |
Team | Everybody in the workspace | Any Administrator — not its author, unless they are an Administrator |
Core | Everybody | Nobody |
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
| Status | Code | When |
|---|---|---|
200 | — | The views the actor can see. |
403 | API_KEY_ACTS_AS_WORKSPACE | The 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
viewKey | path | string | Yes | A 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
| Status | Code | When |
|---|---|---|
200 | — | The view. |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. |
404 | NOT_FOUND | No 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"
}
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | The view's name. Trimmed; at most 200 characters. |
type | string | No | Private (default), UsersGroups or Team. Core is refused. Anything but Private requires the actor to be an Administrator — see the note below. |
search | string | No | Free text to save with the view, at most 1000 characters. Stored and returned; the app applies it, the API does not. |
statuses | array of string | No | The statuses to show, or ["all"]. Default: the four open statuses. An empty array is refused. |
allTemplates | boolean | No | true for every template. When left out it is true if templates is empty and false otherwise. true alongside a non-empty templates is refused. |
templates | array of string | No | Template keys to narrow the view to. Duplicates are dropped. |
includeStandalone | boolean | No | Show standalone tasks. Default true. |
allAssignees | boolean | No | true 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. |
includeUnassigned | boolean | No | Show tasks assigned to nobody. Default false. |
assignees | array | No | Whose tasks to show. Each entry is { "type", "id" }, or { "name" } with a full name, email address or group name. Duplicates are dropped. |
sort | string | No | name, status, dueDateTime, checklistName, templateName, assignees, commentCount or tags, optionally with :asc or :desc. Default dueDateTime:asc. |
visibleTo | array | No | Who 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
| Status | Code | When |
|---|---|---|
201 | — | The view is saved. |
400 | VALIDATION_ERROR | field 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). |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. |
403 | FORBIDDEN | A Team or UsersGroups view saved by an actor who is not an Administrator. |
Notes
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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
viewKey | path | string (GUID) | Yes | The 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
| Status | Code | When |
|---|---|---|
200 | — | The view as it now reads. |
400 | VALIDATION_ERROR | Anything Save a view refuses. |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. |
403 | FORBIDDEN | The 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. |
404 | NOT_FOUND | No 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
| Name | In | Type | Required | Description |
|---|---|---|---|---|
viewKey | path | string (GUID) | Yes | The 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
| Status | Code | When |
|---|---|---|
204 | — | The view is deleted. |
403 | API_KEY_ACTS_AS_WORKSPACE | The key acts as the workspace. |
403 | FORBIDDEN | The view is one of the five built-in views, or the actor may not delete it. |
404 | NOT_FOUND | No saved view the actor can see has that key. |
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 field | List work parameter |
|---|---|
statuses | status, comma-separated |
allAssignees: true | assignee=all |
assignees and includeUnassigned | assignee, as TeamMember:1043,Group:12, adding unassigned when includeUnassigned is true |
allTemplates: false and templates | template, comma-separated |
includeStandalone | includeStandalone |
sort | sort — except status, assignees and tags, which the list route does not sort by |
search | None. 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.
Related Pages
- 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
isStandaloneisfalse. - Authentication — creating a key that acts as a member, which every route here needs.