Skip to content
Leadtime
English
Esc
↑↓navigate↵open⌘Jpreview

Update a task

Updates an existing task with partial data. Only provided fields will be updated, allowing you to modify specific properties without affecting others. The identifier can be either a UUID or a numeric short number (with or without # prefix). When updating the description, HTML or Markdown format is accepted and will be converted to the internal editor format. Changing the task type automatically updates the status if needed. Changing the project cascades to subtasks and time logs. Description mentions trigger notifications to mentioned users. Field-specific authorization matches the internal product API: most fields require project access only, description updates require authorship or Tasks.editAnyTitleAndDescription, project moves require Tasks.changeProject, and support contingent toggles require Tasks.toggleSupportContingent. Organization members can only update tasks with guestAccess enabled.

PATCH/tasks/{identifier}
Authorization
AuthorizationOAuth2 access token · headerrequired
Scopes:api:write
or
AuthorizationBearer token (JWT) · headerrequired
Path parameters
identifierstringrequired

Task UUID or short number (e.g., "550e8400-e29b-41d4-a716-446655440000" or "123" or "#123")

Query parameters
fieldsToReturnstring

Comma-separated list of top-level response fields to return. Overrides the endpoint compact default unless responseShape=full is used.

responseShapestring

Advanced override. Omit for the endpoint compact default. Use full only when you need the complete endpoint response, including nested fields that are not selectable with fieldsToReturn.

Allowed:compactfull
Header parameters
LT-Response-Shapestring

Advanced override. Set to full only when you need the complete endpoint response, including nested fields that are not selectable with fieldsToReturn.

Allowed:full
Request body
requiredapplication/json
accountableIdobject

UUID of the user who is accountable for the task. Use User.id from GET /projects/{id} users array for the task project; GET /workspace/users is the global pool and not every user is assignable to every project. Set to null to remove accountability.

assignedToIdobject

UUID of the user to assign the task to. Use User.id from GET /projects/{id} users array for the task project; GET /workspace/users is the global pool and not every user is assignable to every project. Set to null to unassign.

blockedByIdsstring[]

Array of task UUIDs that block this task. Replaces the current blocked-by set. An empty array removes every blocker. A cycle rejects the whole patch with TASK_BLOCKING_CYCLE.

customFieldsobject[]

Array of custom field values to update. Each value must correspond to a custom field associated with the task type. The field value format depends on the field type. Replaces all existing custom field values. Use an empty array to clear all custom fields.

Show properties
Array of object
fieldIdstring<uuid>

Custom field ID (UUID). Use GET /tasks/types and/or GET /tasks/custom-fields.

valuestring

Field value (format depends on field type)

deadlinestring

Task deadline or due date in ISO 8601 format (YYYY-MM-DDTHH:mm:ssZ). Used for tracking deadlines and generating deadline warnings. Set to null to remove the deadline.

descriptionstring

Accepts Markdown or HTML for complex formatting. This content is rendered by the Leadtime rich editor, not by a plain Markdown viewer.

For quick/simple text, Markdown is acceptable. For polished user-facing content from an agent or integration, prefer structured HTML because it preserves editor blocks, links, and layout more predictably.

Use only the nodes and marks documented below for this field. Supported editor features differ by endpoint and field. Choose formatting for readability, not decoration: use headings for real sections, paragraphs for narrative text, lists or tables for structured facts, blockquotes for quoted context, callouts for important outcomes/risks/notes when supported, and explicit anchors for links. Do not rely on bare URLs or Markdown links when the link must be clickable; use explicit anchors such as <a href="https://example.com" target="_blank" rel="noopener noreferrer nofollow">link text</a>.

In HTML you can use:

Node Types and Marks

Nodes

paragraph Type: block Content: inline* (inline only — do not use block tags such as <p> inside; use e.g. <br>, <strong>, <em>, <span>…) Default paragraph. extraPlaceholder is an internal structure for the editor to show a ghost placeholder in empty “template” lines (ProseMirror JSON fragment or null). For normal agent output leave extraPlaceholder as null. Only set it if you are intentionally mirroring a field placeholder the user already has in the open editor; do not set random placeholder data for free-form answers. Atts:

  • extraPlaceholder: null
<p class="paragraph-base" extraplaceholder="null/some-value"></p>

heading Type: block Content: inline* (inline only — do not use block tags such as <p> inside; use e.g. <br>, <strong>, <em>, <span>…) Atts:

  • level: 1
<h1 class="heading-base"></h1>

bulletList Type: block list Content: listItem+ Atts: none

<ul class="list-base"><li></li></ul>

hardBreak Type: inline Atts: none

<br>

horizontalRule Type: block Atts: none

<hr class="hr-base">

orderedList Type: block list Content: listItem+ Atts:

  • start: 1
  • type: null
<ol class="order-list-base" type="null/some-value"><li></li></ol>

listItem Content: (paragraph|list)* (paragraphs and/or lists, in any order) Atts: none

<li></li>

blockquote Type: block Content: block+ (one or more block child nodes (e.g. paragraph, list, …)) Atts: none

<blockquote class="blockquote-base"><p class="paragraph-base"></p></blockquote>

codeBlock Type: block Content: text* (text only (plus marks if applicable), no block wrappers) Atts:

  • language: null
<pre><code class="language-null/some-value"></code></pre>

table Type: block Content: tableRow+ Atts: none

<table style="width: 0px;"><colgroup></colgroup><tbody><tr></tr></tbody></table>

tableRow Content: (tableCell | tableHeader)* Atts: none

<tr></tr>

tableHeader Content: block+ (one or more block child nodes (e.g. paragraph, list, …)) Atts:

  • colspan: 1
  • rowspan: 1
  • colwidth: null
  • align: null
<th colspan="1" rowspan="1" colwidth="null/some-value" style="text-align: null/some-value;"><p class="paragraph-base"></p></th>

tableCell Content: block+ (one or more block child nodes (e.g. paragraph, list, …)) Atts:

  • colspan: 1
  • rowspan: 1
  • colwidth: null
  • align: null
<td colspan="1" rowspan="1" colwidth="null/some-value" style="text-align: null/some-value;"><p class="paragraph-base"></p></td>

callout Type: block Content: block+ (one or more block child nodes (e.g. paragraph, list, …)) Callout / info box. The icon attr is an emoji shortcode (e.g. :information_source:, :warning:); it appears on the callout. Body is block content (paragraphs, lists, etc.) — use normal block HTML such as <p class="paragraph-base"> inside the callout <div>. data-type is "callout". Atts:

  • icon: :information_source:
<div data-type="callout" icon=":information_source:"><p class="paragraph-base"></p></div>

condition Type: block Content: conditionBody (a single condition body block) This node conditionally renders its content based on a set of rules. The rules are defined in the 'conditions' attribute. 'conditions' is an object like: { type: 'and' | 'or', expressions: Array<Expression | ConditionGroup> }. An 'Expression' is { field: string, operator: string, value: any }. A 'ConditionGroup' is a nested { type: 'and' | 'or', expressions: [...] }. Example for an expression: { field: 'invoice.total', operator: 'gt', value: 100 } means 'if invoice total is greater than 100'. Supported operators typically include: eq (equals), neq (not equals), gt (greater than), gte (greater than or equal to), lt (less than), lte (less than or equal to), contains, in, is_true, is_false, etc. Check editor UI for available fields and operators. ALL FIELDS CAN ONLY BE EXISTING VARIABLES. DO NOT INVENT NEW FIELDS. Atts:

  • conditions: { "type": "and", "expressions": [] }
<condition conditions="{&quot;type&quot;:&quot;and&quot;,&quot;expressions&quot;:[]}"><condition-body><p class="paragraph-base"></p></condition-body></condition>

conditionBody Content: block+ (one or more block child nodes (e.g. paragraph, list, …)) Atts: none

<condition-body><p class="paragraph-base"></p></condition-body>

emoji Type: inline Inline emoji. icon is a colon shortcode (e.g. :thumbsup:, :white_check_mark:) stored in data-icon; body is often empty. Use names your emoji set supports; avoid inventing invalid shortcodes in final HTML if you need them to render. Atts:

  • icon: :smile:
<span data-type="emoji" data-icon=":smile:"></span>

entity Type: inline Inline link chip to a Leadtime entity (task, project, etc.), usually from the !-picker or by pasting a leadtime link. Display text is #title; data-type is "entity".

  • entityId: Stable id of the target entity (e.g. task or project id). Use ids from the Public API or the user’s context; do not fabricate ids.
  • type: What kind of entity is linked (e.g. task, project) — must be consistent with entityId in your workspace.
  • title: Shown as the visible #label after the chip; should match the real entity title.
  • data: Optional extra JSON the client provides (may be empty). Do not put secrets in HTML. If the user has not given a real entity, use the API to search or create—do not guess UUIDs or labels. Atts:
  • entityId: null
  • type: null
  • title: null
  • data: {}
<span data-type="entity" entityid="null/some-value" type="null/some-value" title="null/some-value" data="[object Object]">#null/some-value</span>

appFile Type: block Block for a file attachment that already exists in the workspace.

  • fileId: Id from Leadtime file storage. Must be real; do not make up.
  • filename and size: Should match the stored file. Use the app upload or API to get a file id; do not embed arbitrary ids. Atts:
  • fileId:
  • filename:
  • size: 0
<div data-type="appFile" fileid="" filename="" size="0"></div>

appImage Type: block Block for an image file already uploaded in Leadtime.

  • fileId: Id of the stored image. Must be a real uploaded file; do not invent.
  • filename: Display name; should match the file.
  • width, align, size: Layout as in the editor. If no file id is available, obtain one via upload/API before outputting this node with a fake id. Atts:
  • fileId:
  • filename:
  • width: 500
  • align: left
  • size: 0
<div data-type="appImage" fileid="" filename="" width="500" align="left" size="0"></div>

mention Type: inline Mentions a workspace member (inserted in the app via the @-picker). The visible label is @name.

  • id: Leadtime user/employee id for the mentioned person. Must match a real user in the workspace; do not invent ids—resolve people from context or the Public API.
  • name: Display name for the @mention label. Should match the user shown for id. HTML must keep data-type="mention" with data-id and data-name in sync; plain text in the node is the visible @name. Atts:
  • id: null
  • name: null
<span data-type="mention" data-name="null/some-value" data-id="null/some-value" id="null/some-value" name="null/some-value">@null/some-value</span>

pageBreak Type: block Page break for PDF/print output (void <page-break> element). Inserts a hard page break when exporting. Use sparingly where the user asked for a new printed page, not for normal on-screen line breaks (use hardBreak/paragraphs instead). Atts: none

<page-break></page-break>

editorPlaceholder Type: block Content: inline* (inline only — do not use block tags such as <p> inside; use e.g. <br>, <strong>, <em>, <span>…) Used in task-type / template fields as a single editable “field” slot. Renders as a <placeholder> block with inline* content (label/instructions) inside. Prefer normal paragraph nodes for free-form user content; use this when reproducing a structured template the user is editing, not for generic text. Atts: none

<placeholder></placeholder>

appVideo Type: block Block for a workspace video file already uploaded in Leadtime (not a generic external embed).

  • fileId: Id of the stored file. Must be a file that actually exists in the workspace after upload; do not fabricate.
  • filename: Display name; should match the file.
  • width, align, size: Layout hints as in the editor; keep realistic values. If you do not have a file id, use the file upload or Public API first—do not guess ids. Atts:
  • fileId:
  • filename:
  • width: 500
  • align: left
  • size: 0
<div data-type="appVideo" fileid="" filename="" width="500" align="left" size="0"></div>

collapse Type: block Content: collapseTitle collapseBody (a collapse title node, then a collapse body) Expandable/collapsible section. Required structure: one collapseTitle (summary, inline) then one collapseBody (blocks) as direct children, matching data-type= collapseTitle / collapseBody tags under <collapse>. Do not use title/body nodes outside of a collapse. Atts: none

<collapse><collapse-title></collapse-title><collapse-body><p class="paragraph-base"></p></collapse-body></collapse>

collapseBody Content: block+ (one or more block child nodes (e.g. paragraph, list, …)) Expandable body of a collapse. Only use as sibling of collapseTitle inside a collapse; holds the block content that shows when expanded. Atts: none

<collapse-body><p class="paragraph-base"></p></collapse-body>

collapseTitle Content: inline* (inline only — do not use block tags such as <p> inside; use e.g. <br>, <strong>, <em>, <span>…) Clickable title row of a collapse block. Only use inside a collapse that also has collapseBody; content is the summary line shown when collapsed. Atts: none

<collapse-title></collapse-title>

variable Type: inline Document/template variable token (span with data-type="variable" and data-id).

  • id: Variable key, often scoped (e.g. currentUser.firstName, project.name). Only use keys that exist for the document type you are in; product docs list the allowed variable ids. Do not invent new variable names in HTML for production templates. Atts:
  • id: null
<span data-type="variable" data-id="null/some-value" id="null/some-value"></span>

embedVideo Type: block Embeds a third-party video in an iframe. The div carries data-video-embed with data-embed-url (iframe src) and data-original-url (canonical page URL).

  • embedUrl: Must be a real embed/iframe URL (e.g. YouTube embed) that matches originalUrl.
  • originalUrl: Human-facing link to the video page; keep it in sync with embedUrl. Do not leave placeholder URLs in final HTML if you claim a real video.
  • Public API HTML may instead use <div data-type="embedVideo" src="supported provider URL" width="640" align="center"></div>. The server derives embedUrl. width is an optional positive integer; align is optionally left, center, or right. Atts:
  • originalUrl:
  • embedUrl:
  • width: null
  • align: null
<div originalurl="" embedurl="" width="null/some-value" align="null/some-value" data-video-embed="" data-original-url="" data-embed-url=""><iframe src=""></iframe></div>

Marks

link Atts:

  • href: null
  • target: _blank
  • rel: noopener noreferrer nofollow
  • class: null
  • title: null
<a target="_blank" rel="noopener noreferrer nofollow" href="">link text example</a>

bold Atts: none

<strong>bold text example</strong>

code Atts: none

<code>code text example</code>

italic Atts: none

<em>italic text example</em>

strike Atts: none

<s>strike text example</s>

underline Atts: none

<u>underline text example</u>
enableSupportContingentboolean

Enable support contingent for this task

estimatedTimenumber

Estimated time to complete the task in hours (decimal allowed). Example: 8 for 8 hours, 2.5 for 2.5 hours.

guestAccessboolean

Whether organization members (guest users) can access this task. When true, guest users can view and interact with the task. When false, only workspace members can access it.

default: false
iconobject

Task icon identifier. Must be in the format :icon_name: (e.g., :rocket:, :bug:, :memo:, :white_check_mark:). Used for visual identification. Set to null to remove the custom icon and use the task type default.

isChangeRequestboolean

Whether this task is a change request. Change requests are typically billed separately and tracked differently in Single projects. Used for scope change management.

prioritystring

Task priority level: Low, Normal, or High. Used for prioritization and filtering.

Allowed:LowNormalHigh
projectIdstring

UUID of the project to move the task to. Use GET /projects. Changing the project cascades to all subtasks and time logs, moving them to the new project as well. The user must have access to the new project.

statusIdstring

UUID of the task status to change to. The status must be valid for the current task type. Use GET /tasks/types and choose from the selected task type statuses array.

subTasksIdsstring[]

Array of task UUIDs to set as subtasks. Replaces all existing subtasks. Use GET /tasks/grid to find accessible tasks. Use an empty array to remove all subtasks.

summarystring

Brief summary or short description of the task. Appears in task cards and lists. Can be auto-generated by AI or manually entered.

tagsstring[]

Array of tag UUIDs to categorize this task. Replaces all existing tags. Use GET /tags/task/list. Use an empty array to remove all tags.

titlestring

Task title or name. Updates the main identifier shown in task lists and views.

typeIdstring

UUID of the task type to change to. Use GET /tasks/types; changing type may require changing status and customFields to values allowed by the new type.

Responses
200

Task updated successfully

accountableobject

Accountable user details

accountableIdstring

Accountable user ID

assignedToobject

Assigned user details

assignedToIdstring

Assigned user ID

billedbooleanrequired

Whether task is billed

blockedByIdsstring[]required

Task IDs that currently block this task

blockingIdsstring[]required

Task IDs that this task currently blocks

childSpentTimenumberrequired

Child tasks spent time in minutes

commentsobject[]required

Task comments; each body is HTML and may contain the same embedded appImage / appFile / appVideo divs with fileId as the task description. Fetch binaries via authenticated /api/public/workspace/files/{fileId} with the same Public API Bearer token when needed.

componentItemIdobject

Component item ID

createdAtstring<date-time>required

Task creation timestamp

customFieldsobjectrequired

Custom fields values

deadlinestring<date-time>

Task deadline

descriptionstringrequired

Task description in HTML. May include embedded assets as elements such as <div data-type="appImage" fileId="…" filename="…"> (images), appFile, or appVideo—binary content is not embedded; use authenticated GET {appOrigin}/api/public/workspace/files/{fileId} with the same Public API Bearer token to retrieve it.

emailDetailsobject

Email details

emailSendErrorstring

Email send error message

emailSendErrorCodestring

Email send error code

emailSendFailedAtstring<date-time>

Email send failed timestamp

emailSendFailedTostring[]

Email send failed recipients

enableSupportContingentbooleanrequired

Enable support contingent

estimatedTimenumber

Estimated time in hours

guestAccessbooleanrequired

Guest access enabled for organization members

historyobject[]required

Task history entries

iconobject

Task icon identifier in the format :icon_name: (e.g., :rocket:, :bug:, :memo:). Can be null if no custom icon is set.

iconIsGeneratingbooleanrequired

Whether icon is being generated by AI

idstringrequired

Task ID (UUID)

isBlockedbooleanrequired

True when at least one blocker is still New, In progress, Feedback, or Backlog

isChangeRequestbooleanrequired

Whether task is a change request

isParticipantbooleanrequired

Whether current user is a participant

notificationSettingsobjectrequired

Notification settings

parentTaskIdobject

Parent task ID for subtasks

participantsCountnumberrequired

Number of participants

participantsListstring[]required

List of participant user IDs

priorityobjectrequired

Task priority (TaskPriority enum)

productsobject[]required

Task products

projectobjectrequired

Project information

projectIdstringrequired

Project ID

quotationsobject[]required

Express quotations

shortNumbernumberrequired

Task short number (workspace-scoped)

skipFromBillingboolean

Skip from billing

spentTimenumberrequired

Total spent time in minutes

statusIdstringrequired

Task status ID

subTasksIdsstring[]required

Child task IDs

summarystring

Task summary

summaryIsGeneratingbooleanrequired

Whether summary is being generated by AI

tagsstring[]required

Task tags

titlestringrequired

Task title

titleIsGeneratingbooleanrequired

Whether title is being generated by AI

typeIdstringrequired

Task type ID

userIdstringrequired

Creator user ID

400

Invalid request data or validation error

401

Unauthorized - Invalid or missing authentication token

403

Access denied: No project access or permission denied

404

Task not found

Try it
Server
Authorization
Parameters
Bodyapplication/json
Request
curl -X PATCH "https://leadtime.app/api/public/tasks/123" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "accountableId": {},
  "assignedToId": {},
  "blockedByIds": [
    "string"
  ],
  "customFields": [
    {
      "fieldId": "84922011-b03d-4966-bc95-c5b49bc2e342",
      "value": "string"
    }
  ],
  "deadline": "string",
  "description": "string",
  "enableSupportContingent": true,
  "estimatedTime": 2.5,
  "guestAccess": false,
  "icon": {},
  "isChangeRequest": true,
  "priority": "Low",
  "projectId": "string",
  "statusId": "string",
  "subTasksIds": [
    "string"
  ],
  "summary": "string",
  "tags": [
    "string"
  ],
  "title": "string",
  "typeId": "string"
}'
Response
{
  "accountable": {},
  "accountableId": "string",
  "assignedTo": {},
  "assignedToId": "string",
  "billed": true,
  "blockedByIds": [
    "string"
  ],
  "blockingIds": [
    "string"
  ],
  "childSpentTime": 0,
  "comments": [
    {}
  ],
  "componentItemId": {},
  "createdAt": "2019-08-24T14:15:22Z",
  "customFields": {},
  "deadline": "2019-08-24T14:15:22Z",
  "description": "string",
  "emailDetails": {},
  "emailSendError": "string",
  "emailSendErrorCode": "string",
  "emailSendFailedAt": "2019-08-24T14:15:22Z",
  "emailSendFailedTo": [
    "string"
  ],
  "enableSupportContingent": true,
  "estimatedTime": 0,
  "guestAccess": true,
  "history": [
    {}
  ],
  "icon": {},
  "iconIsGenerating": true,
  "id": "string",
  "isBlocked": true,
  "isChangeRequest": true,
  "isParticipant": true,
  "notificationSettings": {},
  "parentTaskId": {},
  "participantsCount": 0,
  "participantsList": [
    "string"
  ],
  "priority": {},
  "products": [
    {}
  ],
  "project": {},
  "projectId": "string",
  "quotations": [
    {}
  ],
  "shortNumber": 0,
  "skipFromBilling": true,
  "spentTime": 0,
  "statusId": "string",
  "subTasksIds": [
    "string"
  ],
  "summary": "string",
  "summaryIsGenerating": true,
  "tags": [
    "string"
  ],
  "title": "string",
  "titleIsGenerating": true,
  "typeId": "string",
  "userId": "string"
}