Skip to content

Tasks API

All task endpoints require a Bearer JWT token (Authorization: Bearer <token>). Tasks are scoped to a workspace — include :workspaceId in the path.

Base URL: https://api.hule-do.com/api


POST /workspaces/:workspaceId/tasks

Create a new task.

Request:

json
{
  "title": "Design the new landing page",
  "listId": "667f...",
  "description": "Create mockups for the hero section and feature grid",
  "priority": "high",
  "assigneeId": "667f...",
  "dueDate": "2026-06-15T00:00:00.000Z",
  "tagIds": ["667f...", "667f..."],
  "parentId": null
}
FieldTypeRequiredNotes
titlestringyes
listIdstring (ObjectId)yesTarget list
descriptionstring or RichDocnoPlain text or rich-doc JSON
prioritystringnonone, low, medium, high, urgent
assigneeIdstring (ObjectId)noWorkspace member
dueDateISO 8601no
startDateISO 8601no
tagIdsstring[]noExisting tag IDs
parentIdstring (ObjectId)noParent task for subtasks
timeEstimatenumbernoMinutes

Response: 201

json
{
  "id": "667f...",
  "title": "Design the new landing page",
  "listId": "667f...",
  "statusId": "667f...",
  "statusGroup": "open",
  "priority": "high",
  "assigneeId": "667f...",
  "dueDate": "2026-06-15T00:00:00.000Z",
  "tagIds": ["667f..."],
  "path": [],
  "depth": 0,
  "createdAt": "2026-05-28T10:00:00.000Z",
  "updatedAt": "2026-05-28T10:00:00.000Z"
}

GET /workspaces/:workspaceId/tasks/:id

Get a single task by ID.

Response: 200 — single TaskDto (shape identical to create response).

Errors: 404 if not found or not in this workspace.


PATCH /workspaces/:workspaceId/tasks/:id

Update a task. Omitted fields are not changed. Send null to clear a field.

Request:

json
{
  "title": "Updated title",
  "priority": "urgent",
  "dueDate": null,
  "assigneeId": null
}

Response: 200 — updated TaskDto.


DELETE /workspaces/:workspaceId/tasks/:id

Delete a task and all its subtasks.

Response: 204 No Content


POST /workspaces/:workspaceId/tasks/:id/move

Move a task to a different list. The entire subtree moves with it.

Request:

json
{
  "listId": "667f..."
}

Response: 204 No Content


GET /workspaces/:workspaceId/tasks/query

Query tasks with filtering, grouping, pagination, and search.

Query parameters:

ParameterTypeDescription
viewIdstringScope to a specific view's filters
pagenumberPage number (default 1)
limitnumberItems per page (max 100)
groupBystringstatusGroup, priority, dueDate, assignee, list
searchstringFull-text search in title and description
statusIdstringFilter by status
prioritystringFilter by priority
assigneeIdstringFilter by assignee
tagIdstringFilter by tag
dueDateFromISO 8601Due date range start
dueDateToISO 8601Due date range end

Response: 200

json
{
  "kind": "flat",
  "items": [ /* TaskDto[] */ ],
  "total": 42,
  "page": 1,
  "limit": 20
}

When groupBy is set:

json
{
  "kind": "grouped",
  "groups": [
    {
      "name": "Overdue",
      "items": [ /* TaskDto[] */ ]
    },
    {
      "name": "Today",
      "items": [ /* TaskDto[] */ ]
    }
  ],
  "total": 42
}

Full-text search across the entire workspace.

Query parameters: q (search query), page, limit.

Response: 200

json
{
  "items": [ /* TaskDto[] */ ],
  "total": 12,
  "page": 1,
  "limit": 20
}

GET /workspaces/:workspaceId/tasks/:id/subtree

Get the full subtree of a task (all descendants).

Response: 200TaskDto[], all descendants in a flat array.


Common task errors

CodeMeaning
400Invalid input — e.g. moving a task to be its own ancestor
403You don't have edit access to the target list
404Task not found