Skip to content

Update task

Endpoint

Use a different URL depending on the task type:

  • Process task: PUT /organizations/{org_id}/runs/{run_id}/tasks/{task_id}
  • One-off task: PUT /organizations/{org_id}/tasks/{task_id}

Replace {org_id}, {run_id} (if applicable), and {task_id} with actual IDs.

Request

Headers

  • Authorization: Bearer {your_access_token}
  • Accept: application/json
  • X-Tallyfy-Client: APIClient
  • Content-Type: application/json

Body (JSON)

Send a JSON object with only the fields you want to change. Updatable fields include:

  • title (string): New task title. Max 600 characters.
  • summary (string): New task description.
  • deadline (string): New deadline in ISO 8601 format (e.g., YYYY-MM-DDTHH:mm:ssZ). Deadlines are automatically adjusted to the organization’s working days.
  • started_at (string): Set or change the start date/time.
  • owners (object): Update assignees. Structure: { "users": [user_id1, ...], "guests": ["guest@email.com", ...], "groups": [group_id1, ...] }. This replaces existing assignees.
  • taskdata (object): Update form field values (see details below).
  • webhook (string): Update the task-specific webhook URL.
  • prevent_guest_comment (boolean): Enable/disable guest comments.
  • position (integer): Change the task’s position order.
  • max_assignable (integer): Set the maximum number of assignees.

Updating form fields with taskdata

Include a taskdata object in the request body. Keys are form field timeline IDs, and values depend on the field type.

taskdata and the prerun object used when launching a process run through the same validator, so the value shapes below are identical on both surfaces.

Field typeValue to send
Short textA plain string, max 200 characters
Long text (textarea)A plain string, max 30,000 characters
EmailA plain string
DateAn ISO 8601 string: "2025-12-31T23:59:59Z"
Radio buttonThe option’s text as a bare string: "Full-time"
DropdownOne object with both keys: { "id": 3, "text": "Office 365", "value": null }
Checklist (multi-select)A list of those objects, each with "selected": [{ "id": 1, "text": "Slack", "selected": true }]
TableA flat list with one entry per column, in column order: ["Widget", "3"]
Assignees{ "users": [12345], "guests": ["guest@example.com"], "groups": ["group_id"] }
File/ImageA list of file objects. See Attach files using the API - files must be uploaded first.

Three shapes catch people out:

  • Radio and dropdown look identical in the app but differ here. A radio takes the bare option text. A dropdown needs the id and text pair together, and the text has to match the option exactly.
  • Every chosen multi-select option needs "selected": true. Without it the value still saves and you still get a 200, but the field renders as empty text wherever it’s used as a {{variable}}. A blank multi-select in a task description or an email is nearly always a missing selected flag.
  • A table takes one entry per column, not per row. Send a different number of entries and the request fails with Number of columns does not match required columns.

Multiple field types in one call

{
"taskdata": {
"e4238158ad0949d4ad78c55125b28a99": "normal text field", // Short text
"ad789434de1c4d5fade2193d237c5716": "Text Area content here", // Long text/textarea
"7a54e215a9904096851360917080599f": "yes", // Radio button
"8c0161f92eba4d3da7182fed348f3421": "2025-12-20T14:23:18.128Z", // Date field
"0e4b280880cc4407a06478a2faa8052b": { // Dropdown selection
"id": 2,
"text": "Office 365",
"value": null
},
"fe316c2ac44a421cafbf128c9462b8e9": [ // Multi-select checkboxes
{
"id": 1,
"text": "Slack",
"value": null,
"required": true,
"selected": true
},
{
"id": 2,
"text": "Teams",
"value": null,
"required": false,
"selected": false
}
]
}
}

Updating assignees with owners

{
"owners": {
"users": [1001, 1002], // Assign users 1001 and 1002
"groups": [], // Remove all group assignments
"guests": ["new.client@example.com"] // Assign this guest
}
}

Code samples

const accessToken = 'YOUR_PERSONAL_ACCESS_TOKEN';
const orgId = 'YOUR_ORGANIZATION_ID';
const runId = 'PROCESS_RUN_ID'; // Or null/omit for one-off task
const taskId = 'TASK_ID_TO_UPDATE';
// Choose the correct URL based on task type
const apiUrl = runId
? `https://go.tallyfy.com/api/organizations/${orgId}/runs/${runId}/tasks/${taskId}`
: `https://go.tallyfy.com/api/organizations/${orgId}/tasks/${taskId}`;
const updatePayload = {
// Example: Update deadline and a text form field
deadline: "2025-07-01T09:00:00Z", // Use ISO 8601 Format
taskdata: {
"text_field_id_example": "Updated value from JS" // Use actual Field ID
},
// Example: Change assignees (this REPLACES the entire list)
owners: {
users: [1005], // Assign only user 1005
groups: [], // Remove all group assignments
guests: [] // Remove all guest assignments
}
};
const headers = new Headers();
headers.append('Authorization', `Bearer ${accessToken}`);
headers.append('Accept', 'application/json');
headers.append('X-Tallyfy-Client', 'APIClient');
headers.append('Content-Type', 'application/json');
fetch(apiUrl, {
method: 'PUT',
headers: headers,
body: JSON.stringify(updatePayload)
})
.then(response => {
return response.json().then(data => { // Attempt to parse JSON regardless of status
if (!response.ok) {
console.error(`Failed to update task ${taskId}:`, data);
throw new Error(`HTTP error! status: ${response.status}`);
}
return data; // Pass successful data along
});
})
.then(data => {
console.log(`Successfully updated task ${taskId}:`);
console.log(JSON.stringify(data, null, 2));
})
.catch(error => {
console.error(`Error updating task ${taskId}:`, error.message);
});

Response

Returns 200 OK with the full task object after the update, wrapped in a data envelope.

{
"data": {
"id": "TASK_ID_TO_UPDATE",
"title": "Go Updated Task Title",
"status": "active",
"owners": {
"users": [{ "id": 1005, ... }],
"groups": [],
"guests": []
},
"deadline": "2025-07-01T09:00:00Z",
"started_at": "2025-06-01T09:00:00Z",
"last_updated": "2025-05-20T16:00:00Z",
"taskdata": {
"text_field_id_example": "Updated value from JS",
"dropdown_field_id_example": { "id": 3, ... },
"radio_button_field_id": "Option B"
},
"webhook": null,
"prevent_guest_comment": false,
"position": 1,
"is_oneoff_task": false
}
}

Note that summary only appears in the response when you fetch a single task (not in list responses), or when you include ?with=summary.

Completed tasks can’t be updated - you’ll get a validation error. Other error codes: 404 (task not found), 403 (no permission), 422 (validation failure - wrong field type, missing required fields).


Processes > Update process

Tallyfy’s API lets you partially update a running process by sending a PUT request with only the…