Overview
Tasks use short public codes (taskCode, listCode, templateCode, parentCode) - not UUIDs. Responses use camelCase. Discovery endpoints help you find codes before create/update.
Endpoints
GET /tasks - list tasks
GET /tasks/{taskCode} - get one task
POST /tasks - create task (optional listCode, parentCode, templateCode, assignees, OKR/KPI/wiki links)
PATCH /tasks/{taskCode} - update fields, move list/parent, change assignees, link OKR/KPI/wiki
GET /tasks/folders - folder hierarchy with nested lists (listCode on each list)
GET /tasks/lists - flat list of task lists
GET /tasks/lists/{listCode} - list metadata
GET /tasks/lists/{listCode}/tasks - list or create tasks in a list
GET /tasks/templates - list templates
GET /tasks/templates/{templateCode} - template structure preview (no task creation)
POST /tasks/templates/{templateCode}/tasks - instantiate template
GET /tasks/members - assignable workspace members (email, firstName, lastName)
Scopes
tasks:read for GET; tasks:write for POST and PATCH. User needs Tasks page read/create/update permission.
Limits
Up to 7 nesting levels (root depth 0)
Up to 1,000 subtasks per parent (including nested)
Up to 50,000 tasks per list (subtasks count toward the list total)
Recurring settings are removed when a task has 500+ subtasks
List tasks (GET /tasks)
limit, offset - pagination
status - todo | in_progress | completed
listCode - filter by short list code from GET /tasks/lists
assigneeEmail - filter by assignee email
search - match title or description (case-insensitive)
includeSubtasks - when false (default), only top-level tasks
curl "https://api.elevale.app/v1/workspaces/{workspaceId}/tasks?limit=10&listCode=l8k2mnp4x" \
-H "Authorization: Bearer elv_pat_..."Get task (GET /tasks/{taskCode})
Returns task detail with taskCode, listCode, parentCode, assigneeEmails, subtaskCount, and linked okrId / kpiId / wikiPageSlug when set.
curl "https://api.elevale.app/v1/workspaces/{workspaceId}/tasks/t4idqd7wa" \
-H "Authorization: Bearer elv_pat_..."Folders (GET /tasks/folders)
Returns nested folders; each folder includes lists with listCode, name, and orderIndex. Use listCode on create or PATCH to place tasks.
Create body (POST /tasks or POST .../lists/{listCode}/tasks)
title (required unless templateCode) - string
description, status, priority, dueDate - optional
listCode - short list code (optional on POST /tasks; implied when posting under /lists/{listCode}/tasks)
parentCode / parentId - create as subtask under parent taskCode
templateCode - instantiate a template (body fields override template root)
assigneeEmail / assigneeEmails - workspace member email(s)
okrId - link OKR UUID from GET /okrs
kpiId - link KPI UUID from GET /kpis
wikiPageSlug - link wiki page slug from GET /wiki/pages
curl -X POST "https://api.elevale.app/v1/workspaces/{workspaceId}/tasks" \
-H "Authorization: Bearer elv_pat_..." \
-H "Content-Type: application/json" \
-d '{"title":"Follow up","parentCode":"t4idqd7wa","listCode":"l8k2mnp4x","assigneeEmail":"[email protected]"}'Template preview (GET /tasks/templates/{templateCode})
Read-only structure of the template tree (titles, priorities, nested children) before calling POST .../templates/{templateCode}/tasks.
Update body (PATCH /tasks/{taskCode})
title, description, status, priority, dueDate - standard fields
listCode - move task to a list
clearList - true to remove from list
parentCode / parentId - move under another task
clearParent - true to promote to top-level
assigneeEmail / assigneeEmails - replace assignees
clearAssignees - true to remove all assignees
okrId, kpiId, wikiPageSlug - link or unlink (null to clear)
curl -X PATCH "https://api.elevale.app/v1/workspaces/{workspaceId}/tasks/t4idqd7wa" \
-H "Authorization: Bearer elv_pat_..." \
-H "Content-Type: application/json" \
-d '{"status":"in_progress","listCode":"l8k2mnp4x"}'Related
Personal access tokens (PATs) · Scopes and permissions · Reading data (GET API)
Custom list statuses
Task lists can define custom status columns in the product UI. The API supports them on create and update when the task belongs to a list.
status: legacy values todo, in_progress, or completed (default when no custom status is set).
statusId: UUID of a row in task_list_statuses for that list. Copy from the product UI or your automation store.
statusName: case-insensitive match on the custom status name within the target list (for example Review).
statusId and statusName require the task to be list-assigned, include listCode on create, or PATCH an existing task that already has a list.
GET responses include statusId when set; legacy status is derived from the status group (active → in_progress, done → completed).
There is no public list-statuses endpoint yet, discover statusId values from the Tasks UI or your integration logs.