Tasks
A task is one piece of work in a deliverable. Read a project’s tasks with GET /projects/:id, then change one task here. The task screens in Drum and the MCP update_task tool run the same operation, so the same rules apply everywhere.
Task dates are calendar days, written yyyy-mm-dd, in the account’s time zone.
Endpoints
| Method and path | Does |
|---|---|
PATCH /api/v1/projects/:project_id/tasks/:id |
Changes one task’s status, dates, note or members |
To add, move or delete tasks on an opportunity, or to change their names and other fields, see Opportunities.
Change a task
PATCH /api/v1/projects/:project_id/tasks/:id changes the fields you send. Send them flat or under task. Other keys are ignored.
:project_id can be a delivery project or an opportunity. The task must be on a kept deliverable of that project.
| Field | Rules |
|---|---|
status |
not_started, in_progress, completed, not_applicable or blocked. null is refused |
start_date |
yyyy-mm-dd, from 1900 to 2099. null or "" clears it |
due_date |
yyyy-mm-dd, from 1900 to 2099. null or "" clears it. A due date before the start date is accepted |
note |
The task description. Up to 10,000 characters, stored exactly as sent. null clears it |
member_ids |
Array of up to 100 member ids (from GET /members). Replaces the assigned members. [] removes every member that can be removed. null is refused |
Send at least one field.
PATCH /api/v1/projects/20488/tasks/55120
{
"task": {
"status": "completed",
"due_date": "2026-10-16",
"member_ids": [4821, 4830]
}
}
What a change does
- Completing a task sets its completed date and records the token’s user as the member who completed it. If the account stops time entry on completed tasks, time can no longer be logged to it. Moving a task out of
completedclears the completed date and who completed it. - Deliverable progress follows its tasks, so a status change can change the deliverable’s status and progress. A status change can also run the account’s automations.
- New members must be current members of the account. Each gets an assignment with no planned hours, and Drum notifies them. On an event task the member’s booking is updated instead, and the booking notifies them.
- Removed members lose only assignments that have no planned hours, budget line, variation line or delivery data (such as logged time). Otherwise the member stays assigned and the response has an
assignee_keptwarning that says why. - The budget never changes. If a member change would change the task’s budget, contract value, budget lines, variation rows or hours, the whole request is refused with
422 budget_would_change.
Send the current members with your change, so you do not remove anyone by accident. The response lists them.
Response
Returns 200:
{
"task": {
"id": 55120,
"name": "Shop drawings",
"status": "completed",
"note": "Issue for client review before fabrication.",
"item_type": "task",
"start_date": "2026-10-01",
"due_date": "2026-10-16",
"completed_date": "2026-10-13",
"members": [
{"id": 4821, "name": "Jordan Reed"},
{"id": 4830, "name": "Priya Shah"}
],
"completed_by": [{"id": 4821, "name": "Jordan Reed"}],
"deliverable": {"id": 30411, "name": "Design development"},
"project": {"id": 20488, "name": "Riverside fit-out", "project_number": "2026-088"}
},
"warnings": []
}
| Field | Meaning |
|---|---|
item_type |
task, heading, event or process_only |
start_date, due_date, completed_date |
yyyy-mm-dd, or null |
members |
The members assigned to the task. id is the member id. A member who only logged time is not listed |
completed_by |
The members who completed the task |
warnings |
{code, message, subject_id} for each member who stayed assigned. code is assignee_kept and subject_id is the member id |
GET /projects/:id gives task dates as timestamps. Read those in the account’s time zone: a due date of 16 October 2026 in a Sydney account is 2026-10-16T12:59:59.999Z. This endpoint gives the plain date.
Permissions
The token needs api_update. The token’s user needs one of:
- A project update permission:
update_all_projects,update_team_projects(projects of their teams), orupdate_assigned_projects(projects or tasks they are assigned to). - For a task on an opportunity, an opportunity update permission:
update_all_opportunities,update_team_opportunitiesorupdate_assigned_opportunities. - A task permission:
manage_all_tasks,manage_team_tasks, ormanage_assigned_tasks(tasks they are assigned to).
A task the token’s user can read but not change returns 403 not_authorized. A task they can neither read nor change returns 404 task_not_found.
Errors
| Status | code |
When |
|---|---|---|
403 |
none | No api_update ({"error": "Insufficient API permissions"}) |
403 |
not_authorized |
The token’s user can read the task but may not change it |
404 |
task_not_found |
The task is not on this project, is deleted, or is hidden |
404 |
member_not_found |
A new member is not a current member of the account. field is member_ids[<index>] |
409 |
task_busy |
Another change to the task ran at the same time. Send the request again |
422 |
missing_input |
No field was sent (field is changes) |
422 |
invalid_input |
A value could not be read. field names it, for example due_date or member_ids[1] |
422 |
budget_would_change |
The member change would change the task’s budget or hours. Nothing changed |
422 |
time_row_has_hours |
A new member has a logged-time row with planned hours on the task. Assign them on the task’s Work tab in Drum |
422 |
task_is_pending_variation |
A member change on a task of a variation that is not approved yet |
422 |
validation_failed |
The task would not save. errors lists why |