Tasks
CRM tasks — the Task object, linking a task to an order or contact, due dates and overdue reminders, and every endpoint for listing, creating, updating and deleting tasks.
A task is a to-do for a project member: call a customer back, send a quote, check a delivery. A task has an assignee
(user_uuid), an optional due date, and can be linked to an order or a contact. Creating and completing a
linked task is recorded in that order's or contact's journal.
A task is either open or done. When an open task passes its due date, the assignee is notified and the project's
task_overdue automations run once. If the due date is moved later, the reminder can fire again.
Field types follow the field notation.
Access
Every endpoint on this page requires both the projects and tasks OAuth scopes. The user must be a member of the
project, and the owner's subscription must be active. Otherwise the endpoint returns 404 RES_NOT_FOUND. The project
owner bypasses permission checks.
| Permission | Grants |
|---|---|
can_view_own_tasks |
Read tasks assigned to the user (user_uuid) |
can_view_role_tasks |
Read tasks assigned to members with the same role as the user |
can_view_all_tasks |
Read every task in the project |
can_edit_tasks |
Create, update and delete tasks |
Every endpoint that addresses a task, including updating and deleting it, sees only the tasks within the user's widest
view permission. A task outside that range behaves as if it does not exist (404 RES_NOT_FOUND).
The assignee (user_uuid) must be a member of the project; otherwise the request fails with 400 RES_NOT_FOUND. On
update it is checked only when it changes.
Task Object
Task Structure
| Field | Type | Description |
|---|---|---|
| uuid | uuid | Task ID |
| title | string | Title, 1–255 characters |
| description | ?string | Details, up to 5000 characters |
| status | string | open or done |
| due_date | ?ISO8601 datetime | Deadline |
| user_uuid | uuid | Assignee |
| user_name | string | Assignee's full name |
| created_by | ?uuid | Who created the task; null if an automation created it |
| entity_type | ?string | order or contact if the task is linked |
| entity_uuid | ?uuid | ID of the linked order or contact |
| entity_name | ?string | The linked order's serial or the contact's name; null if the entity was deleted |
| completion_note | ?string | Result of the work, up to 5000 characters |
| completed_at | ?ISO8601 datetime | When the task was marked done; cleared if it is reopened |
| created_at | ISO8601 datetime | When the task was created |
| updated_at | ISO8601 datetime | When the task was last changed |
Example Task
{
"uuid": "0199a7c1-4d5e-7f60-8172-839405a1b2c3",
"title": "Send the revised quote",
"description": "Customer wants a price with triple glazing.",
"status": "open",
"due_date": "2026-10-03T15:00:00.000Z",
"user_uuid": "0198e7aa-91f0-7c22-a4d1-0f9e8d7c6b5a",
"user_name": "Anna Petrova",
"created_by": "0198e7aa-91f0-7c22-a4d1-0f9e8d7c6b5a",
"entity_type": "order",
"entity_uuid": "0199a4e2-7b1c-7c3e-9d2a-5f4e8b1c0a11",
"entity_name": "26274003",
"completion_note": null,
"completed_at": null,
"created_at": "2026-10-01T09:45:00.000Z",
"updated_at": "2026-10-01T09:45:00.000Z"
}
Linking a task
entity_type and entity_uuid go together. Send both to link a task, send both as null to unlink it, or omit both.
The order or contact must exist in this project; otherwise the request fails with 400 TASK_ENTITY_NOT_FOUND.
What a link records in the entity's journal:
| Event | Order journal | Contact journal |
|---|---|---|
| Task created | task_created |
task_created |
Task moved from open to done |
task_completed |
task_completed |
completion_note set or changed to a non-empty value |
note with the note text, also visible on the order's contact |
note |
The task_created and task_completed payload is {task_uuid, title, due_date}.
List Tasks
GET /api/v1/projects/{project.uuid}/tasks
Returns the tasks visible to the user. Tasks are sorted by due date, soonest first, with undated tasks last; ties go to the newest task.
Requires one of can_view_own_tasks, can_view_role_tasks, can_view_all_tasks.
Query String Params
| Field | Type | Description |
|---|---|---|
| page? | integer | Page number, from 1. Default 1 |
| limit? | integer | Page size, 1–100. Default 50 |
| filters? | string | A URL-encoded JSON array of filter objects. Invalid JSON is ignored |
Task Filter Structure
Each filter is {"field": ..., "value": ...}. Filters with the same field combine with OR; different fields
combine with AND. Filters with an empty value are skipped.
| field | value | Matches |
|---|---|---|
title |
string | Title contains the value, case-insensitive |
member |
uuid | Assignee |
status |
string | open or done |
entity_type |
string | order or contact |
entity_uuid |
uuid | Linked order or contact |
overdue |
any non-empty | Open tasks whose due date has passed |
due_from |
date | Due on or after this date, e.g. 2026-10-01 |
due_to |
date | Due on or before this date, the whole day included |
Example Request
All open tasks of one order:
[
{
"field": "entity_uuid",
"value": "0199a4e2-7b1c-7c3e-9d2a-5f4e8b1c0a11"
},
{
"field": "status",
"value": "open"
}
]
GET /api/v1/projects/0198e7a0-0000-7000-8000-000000000001/tasks?filters=%5B%7B%22field%22%3A%22entity_uuid%22%2C%22value%22%3A%220199a4e2-7b1c-7c3e-9d2a-5f4e8b1c0a11%22%7D%2C%7B%22field%22%3A%22status%22%2C%22value%22%3A%22open%22%7D%5D
Authorization: Bearer <access_token>
Response
200 OK — an array of task objects.
Errors
| Status | Code | When |
|---|---|---|
| 403 | AUTH_INSUFFICIENT_SCOPE |
The token lacks projects or tasks |
| 403 | AUTH_NO_PROJECT_ACCESS |
The user's role has no task view permission |
| 404 | RES_NOT_FOUND |
The project does not exist or is not accessible |
Get Task
GET /api/v1/projects/{project.uuid}/tasks/{task.uuid}
Returns a single task.
Requires one of can_view_own_tasks, can_view_role_tasks, can_view_all_tasks.
Errors
| Status | Code | When |
|---|---|---|
| 403 | AUTH_INSUFFICIENT_SCOPE |
The token lacks projects or tasks |
| 403 | AUTH_NO_PROJECT_ACCESS |
The user's role has no task view permission |
| 404 | RES_NOT_FOUND |
The project or task does not exist, or the task is outside the user's visibility |
Create Task
POST /api/v1/projects/{project.uuid}/tasks
Creates an open task. If it is linked, a task_created entry is written to the entity's journal.
Requires can_edit_tasks.
JSON Params
| Field | Type | Description |
|---|---|---|
| title | string | 1–255 characters, trimmed |
| description? | ?string | Up to 5000 characters |
| due_date? | ?ISO8601 datetime | Deadline in UTC, ending in Z, e.g. 2026-10-03T15:00:00Z. Offsets like +03:00 are rejected |
| user_uuid? | uuid | Assignee. Default: the authenticated user |
| entity_type? | ?string | order or contact, see Linking a task |
| entity_uuid? | ?uuid | ID of the order or contact |
Example Request
{
"title": "Send the revised quote",
"due_date": "2026-10-03T15:00:00Z",
"entity_type": "order",
"entity_uuid": "0199a4e2-7b1c-7c3e-9d2a-5f4e8b1c0a11"
}
Response
201 Created
{
"uuid": "0199a7c1-4d5e-7f60-8172-839405a1b2c3"
}
Errors
| Status | Code | When |
|---|---|---|
| 400 | REQ_VALIDATION_FAILED |
The body does not match the schema |
| 400 | TASK_ENTITY_NOT_FOUND |
Only one of entity_type/entity_uuid is set, or the entity does not exist in this project |
| 403 | AUTH_INSUFFICIENT_SCOPE |
The token lacks projects or tasks |
| 403 | AUTH_NO_PROJECT_ACCESS |
The user's role lacks can_edit_tasks |
| 404 | RES_NOT_FOUND |
The project does not exist or is not accessible |
Modify Task
PATCH /api/v1/projects/{project.uuid}/tasks/{task.uuid}
Updates only the fields you send.
- Setting
statustodonesetscompleted_atand, for a linked task, writestask_completedto the journal. Setting it back toopenclearscompleted_at. - Changing
due_datere-arms the overdue and due-soon reminders. - Setting
completion_noteto a new non-empty value copies it into the linked entity's journal as a note.
Requires can_edit_tasks.
JSON Params
All fields are optional, but at least one must be present.
| Field | Type | Description |
|---|---|---|
| title? | string | 1–255 characters |
| description? | ?string | Up to 5000 characters |
| status? | string | open or done |
| due_date? | ?ISO8601 datetime | Deadline; null removes it |
| user_uuid? | uuid | Assignee |
| entity_type? | ?string | See Linking a task |
| entity_uuid? | ?uuid | See Linking a task |
| completion_note? | ?string | Result of the work, up to 5000 characters |
Example Request
{
"status": "done",
"completion_note": "Quote sent, customer will reply by Monday."
}
Response
204 No Content
Errors
| Status | Code | When |
|---|---|---|
| 400 | REQ_VALIDATION_FAILED |
The body does not match the schema |
| 400 | REQ_NO_DATA_PROVIDED |
The body has no fields |
| 400 | TASK_ENTITY_NOT_FOUND |
The resulting link is incomplete or points to a missing entity |
| 403 | AUTH_INSUFFICIENT_SCOPE |
The token lacks projects or tasks |
| 403 | AUTH_NO_PROJECT_ACCESS |
The user's role lacks can_edit_tasks |
| 404 | RES_NOT_FOUND |
The project or task does not exist, or the task is outside the user's visibility |
Replace Task
PUT /api/v1/projects/{project.uuid}/tasks/{task.uuid}
Same as Modify Task, but every field in the table must be present. Nullable fields accept null.
Requires can_edit_tasks.
Response
204 No Content
Errors
Same as Modify Task, except REQ_NO_DATA_PROVIDED.
Delete Task
DELETE /api/v1/projects/{project.uuid}/tasks/{task.uuid}
Permanently deletes the task. Journal entries it has already produced stay.
Requires can_edit_tasks.
Response
204 No Content
Errors
| Status | Code | When |
|---|---|---|
| 403 | AUTH_INSUFFICIENT_SCOPE |
The token lacks projects or tasks |
| 403 | AUTH_NO_PROJECT_ACCESS |
The user's role lacks can_edit_tasks |
| 404 | RES_NOT_FOUND |
The project or task does not exist, or the task is outside the user's visibility |