Tasks
Tasks represent units of work within a project. They support assignment, priority levels, dependencies, and project-defined statuses.
List Tasks
GET /v1/projects/:projectId/tasks Retrieve tasks for a project. Tasks are always scoped to a project within an organization (the organization is taken from your access token).
Query Parameters
| Parameter | Type | Description |
|---|---|---|
spec_id | UUID | Filter by the spec a task belongs to |
status | string | Filter by status key (statuses are defined per project) |
assignee_id | UUID | Filter by assigned user |
limit | integer | Max results (1–100) |
offset | integer | Pagination offset |
Response
{
"success": true,
"data": [
{
"id": "...",
"project_id": "...",
"spec_id": "...",
"title": "Implement login flow",
"status_key": "in_progress",
"status_name": "In Progress",
"priority": "high",
"assigned_to": "...",
"due_date": null,
"created_at": "2026-04-10T08:00:00Z",
"updated_at": "2026-04-12T14:30:00Z"
}
],
"pagination": {
"total": 42,
"limit": 50,
"offset": 0,
"has_more": true
}
} Create Task
POST /v1/projects/:projectId/tasks Request Body
{
"title": "Implement login flow",
"description": "Add email/password login with MFA support",
"spec_id": "...",
"priority": "high",
"assignee_id": "...",
"depends_on": ["..."]
}
Only title is required. All other fields are optional;
depends_on is a list of task IDs this task depends on.
Do not send id, org_id, created_at, or
updated_at; these are assigned by the server. The
organization is taken from your access token, and the task is scoped to the
project in the path.
Response
On success the new task’s ID is returned in the standard envelope;
fetch the full record with GET /v1/tasks/:taskId.
{
"success": true,
"data": "..."
} Response Codes
| Status | Meaning |
|---|---|
201 Created | Task created; the new task ID is returned |
400 Bad Request | Invalid project ID, malformed JSON, or request body validation failure |
401 Unauthorized | Missing or invalid access token |
403 Forbidden | Caller lacks permission to create tasks in this project |
404 Not Found | The referenced project does not exist in your organization |
500 Internal Server Error | Unexpected server error |
Get Task
GET /v1/tasks/:taskId Response
{
"success": true,
"data": {
"id": "...",
"project_id": "...",
"spec_id": "...",
"title": "Implement login flow",
"description": "Add email/password login with MFA support",
"status_id": "...",
"status_key": "in_progress",
"status_name": "In Progress",
"priority": "high",
"assigned_to": "...",
"due_date": null,
"parent_task_id": null,
"created_at": "2026-04-10T08:00:00Z",
"updated_at": "2026-04-12T14:30:00Z"
}
} Update Task
PUT /v1/tasks/:taskId Update one or more fields on a task. Only provided fields are modified; at least one field must be supplied.
Request Body
{
"status": "done",
"priority": "medium",
"assignee_id": "...",
"depends_on": ["..."]
} Delete Task
DELETE /v1/tasks/:taskId Deletes the task.
Task Activity
GET /v1/tasks/:taskId/activity List the activity log for a task (status changes, assignments, edits).
Task Statuses
Task statuses are not a fixed list; status keys are defined per
organization and can be scoped to a single project. The status
field accepted on update references one of these status keys, and updating
a task to a status key that is not defined is rejected as a validation
error.
Task Priorities
| Priority | Description |
|---|---|
critical | Blocking issue requiring immediate attention |
high | Important work for the current sprint |
medium | Standard priority |
low | Non-urgent, can be deferred |