Appearance
tasks
12 endpoints at a glance
| Method | Path | Summary |
|---|---|---|
GET | /tasks | List Tasks |
POST | /tasks | Create Task |
DELETE | /tasks/{task_id} | Soft Delete Task |
GET | /tasks/{task_id} | Get Task |
PATCH | /tasks/{task_id} | Update Task |
POST | /tasks/{task_id}/complete | Complete Task |
DELETE | /tasks/{task_id}/export-to-caldav | Unexport |
POST | /tasks/{task_id}/export-to-caldav | Export |
POST | /tasks/{task_id}/move | Move Task |
POST | /tasks/{task_id}/restore | Restore Task |
POST | /tasks/bulk | Bulk |
POST | /tasks/reorder | Reorder |
tasks
List Tasks
GET
/tasks
Cross-project list with filters.
Pass status and tag_id multiple times to combine values:
?status=backlog&status=in_progress.
include_descendants (with project_id) rolls up the project and
its whole visible sub-tree — used by the parent project's Tasks tab.
The cap is 500 here (vs the usual 200) so a wide tree isn't silently
truncated; the SPA surfaces a hint when has_more is still true.
Parameters
Header Parameters
authorization
Query Parameters
project_id
include_descendants
Type
boolean
Default
falseparent_task_id
status
tag_id
due_before
due_after
q
include_deleted
Type
boolean
Default
falsepage
Type
integer
Default
1limit
Type
integer
Default
50Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Create Task
POST
/tasks
Parameters
Header Parameters
authorization
Request Body
application/json
JSON "title": "string", "description": "string", "project_id": "string", "parent_task_id": "string", "status": "backlog", "priority": "normal", "due_date": "string", "due_has_time": false, "scheduled_for": "string", "scheduled_has_time": false, "assignee_id": "string", "tag_ids": [ "string" ], "recurrence_rule": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Get Task
Soft Delete Task
Update Task
PATCH
/tasks/{task_id}
Parameters
Header Parameters
authorization
Path Parameters
task_id*
Type
Requiredstring
Request Body
application/json
JSON "title": "string", "description": "string", "project_id": "string", "parent_task_id": "string", "status": "string", "priority": "string", "due_date": "string", "due_has_time": true, "scheduled_for": "string", "scheduled_has_time": true, "assignee_id": "string", "tag_ids": [ "string" ], "position": 0, "custom_fields": { "additionalProperties": "string" }, "recurrence_rule": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Move Task
POST
/tasks/{task_id}/move
Move a task (and any descendants) to a different project.
Parameters
Header Parameters
authorization
Path Parameters
task_id*
Type
Requiredstring
Request Body
application/json
JSON "project_id": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Complete Task
Restore Task
Reorder
POST
/tasks/reorder
Bulk-update (status, position) for many tasks.
Used by the kanban board on drag-drop and by list-view manual
reordering. The client computes the full target ordering for each
affected column and ships it; the server doesn't recompute.
Validation: every distinct (task, target-status) pair is checked
against the target task's project's effective status list. We fetch
each task's project once and reuse.
Parameters
Header Parameters
authorization
Request Body
application/json
JSON "items": [ { "task_id": "string", "status": "string", "position": 0 } ]
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Bulk
POST
/tasks/bulk
Run one action against a list of task ids in one round-trip.
Subtree semantics are NOT applied here — bulk move just moves the
listed ids. For "move this task and its descendants together", use
the per-task /tasks/{id}/move endpoint.
Parameters
Header Parameters
authorization
Request Body
application/json
JSON "task_ids": [ "string" ], "action": "string", "value": "string", "tag_id": "string", "project_id": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}
Export
POST
/tasks/{task_id}/export-to-caldav
Push the task to the user's CalDAV calendar as a VTODO.
Idempotent: subsequent calls update the existing remote resource
using the stored href + etag. Returns the updated task.
Parameters
Header Parameters
authorization
Path Parameters
task_id*
Type
Requiredstring
Request Body
application/json
JSON "calendar_id": "string"
{
}
Responses
Successful Response
application/json
JSON "additionalProperties": "string"
{
}