Partially update project
Updates only the fields provided in the request body. All fields are optional - only included fields will be updated.
How it works:
- Send only the fields you want to update
- Fields not included in the request remain unchanged
- Arrays (users, teams, taskTypes, activities, tags) replace the entire array
- Set a field to null to clear it (where applicable)
Description Format: If you provide a description field, it accepts HTML or Markdown and will be converted to the internal IDoc format.
Important Notes:
- organizationId: Can be changed. The numeric project identifier is preserved when available; if it already exists in the target organization, the next available number is assigned automatically. The displayed short name uses the target organization prefix. Set null for internal projects.
- phaseId: Can be updated, but is required for external single projects
- enableExpressQuotations: Only applicable for external projects
- guestAccess: Only applicable for external projects
PATCH
/projects/{id}Authorization
AuthorizationOAuth2 access token · headerrequiredScopes:
api:writeor
AuthorizationBearer token (JWT) · headerrequiredPath parameters
idstringrequiredQuery parameters
fieldsToReturnstringComma-separated list of top-level response fields to return. Overrides the endpoint compact default unless responseShape=full is used.
responseShapestringAdvanced 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:
compactfullHeader parameters
LT-Response-ShapestringAdvanced override. Set to full only when you need the complete endpoint response, including nested fields that are not selectable with fieldsToReturn.
Allowed:
fullRequest body
requiredapplication/jsonactivitiesstring[]Array of time activity IDs enabled for the project. Use GET /administration/task-settings/activities.
categoryIdstringID of the project category. Use GET /projects/categories to retrieve available categories.
customFieldsobjectrequiredProject custom fields as key-value pairs. Keys must be project custom field IDs from GET /administration/project-settings/custom-fields.
deadlineobjectProject deadline date
defaultAccountableIdobjectID of the default accountable user. Use User.id from GET /workspace/users.
descriptionstringAccepts 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
```html
<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
```html
<h1 class="heading-base"></h1>
```
**bulletList**
Type: block list
Content: listItem+
Atts: none
```html
<ul class="list-base"><li></li></ul>
```
**hardBreak**
Type: inline
Atts: none
```html
<br>
```
**horizontalRule**
Type: block
Atts: none
```html
<hr class="hr-base">
```
**orderedList**
Type: block list
Content: listItem+
Atts:
- start: 1
- type: null
```html
<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
```html
<li></li>
```
**blockquote**
Type: block
Content: block+ (one or more block child nodes (e.g. paragraph, list, …))
Atts: none
```html
<blockquote class="blockquote-base"><p class="paragraph-base"></p></blockquote>
```
### Marks
**link**
Atts:
- href: null
- target: _blank
- rel: noopener noreferrer nofollow
- class: null
- title: null
```html
<a target="_blank" rel="noopener noreferrer nofollow" href="">link text example</a>
```
**bold**
Atts: none
```html
<strong>bold text example</strong>
```
**code**
Atts: none
```html
<code>code text example</code>
```
**italic**
Atts: none
```html
<em>italic text example</em>
```
**strike**
Atts: none
```html
<s>strike text example</s>
```
**underline**
Atts: none
```html
<u>underline text example</u>
```
Also accepts ProseMirror IDoc JSON (object or string).
enableExpressQuotationsbooleanWhether express quotations are enabled for this project. Express quotations allow quick pricing of tasks without full project planning. Only applicable for external projects.
guestAccessbooleanWhether guest access is enabled (only applicable for client projects)
iconstringIcon/emoji for the project
namestringName of the project
organizationIdobjectID of the organization (required for client projects, must be null for internal projects). Use GET /organizations to retrieve available organizations.
phaseIdobjectID of the project phase. Use GET /projects/phases to retrieve available phases.
responsibleIdobjectID of the responsible user. Use User.id from GET /workspace/users.
statusIdstringID of the project status. Use GET /projects/statuses to retrieve available statuses.
tagsstring[]Array of tags
taskTypesstring[]Array of task type IDs enabled for the project. Use GET /tasks/types or GET /administration/task-settings/types.
teamsstring[]Array of team IDs assigned to the project. Use GET /teams to retrieve available teams.
typestringProject type - determines if project is internal or client-facing
Allowed:
SingleSupportusersstring[]Array of User.id values assigned to the project. Use GET /workspace/users to retrieve workspace users.
valueGroupstringValue group classification for the project
Allowed:
DirectValueIndirectValueNonValueWasteResponses
200
activitiesstring[]requiredArray of time activity IDs enabled for the project
archivedAtobject | nullrequiredArchived timestamp
categoryIdstringrequiredID of the project category
colorstringrequiredProject color (from organization or workspace default)
createdAtstring<date-time>requiredCreation timestamp
customFieldsobjectrequiredCustom fields as key-value pairs
deadlineobject | nullrequiredProject deadline
defaultAccountableIdobject | nullrequiredID of the default accountable user
descriptionstringrequiredProject description (HTML)
editedAtstring<date-time>requiredLast edit timestamp
enableExpressQuotationsbooleanrequiredWhether express quotations are enabled
guestAccessbooleanrequiredWhether guest access is enabled
iconobject | nullrequiredIcon/emoji
idstringrequiredProject ID
isFavoritebooleanrequiredWhether the project is marked as favorite by the current user
namestringrequiredProject name
organizationobject | nullrequiredOrganization details
Show propertiesHide properties
colorstringnamestringshortNamestringorganizationIdobject | nullrequiredID of the organization
phaseIdobject | nullrequiredID of the project phase
responsibleIdobject | nullrequiredID of the responsible user
shortNamestringrequiredProject short name (organization prefix + number)
shortNumbernumberrequiredProject short number
statusIdstringrequiredID of the project status
tagsstring[]requiredArray of tags
taskTypesstring[]requiredArray of task type IDs enabled for the project
teamsstring[]requiredArray of team IDs assigned to the project
typestringrequiredProject type
Allowed:
SingleSupportusersstring[]requiredArray of user IDs assigned to the project
valueGroupstringrequiredValue group classification
Allowed:
DirectValueIndirectValueNonValueWaste401Unauthorized - Invalid or missing authentication token
403Forbidden - Insufficient API scopes or permissions
404Project not found
Request
curl -X PATCH "https://leadtime.app/api/public/projects/string" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"activities": [
"550e8400-e29b-41d4-a716-44665544000b",
"550e8400-e29b-41d4-a716-44665544000c"
],
"categoryId": "550e8400-e29b-41d4-a716-446655440000",
"customFields": {
"customField1": "updated value",
"customField2": 456
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440004",
"description": "<h1>Updated Description</h1><p>This is the updated project description.</p>",
"enableExpressQuotations": false,
"guestAccess": true,
"icon": "🎯",
"name": "Website Redesign v2",
"organizationId": "550e8400-e29b-41d4-a716-446655440003",
"phaseId": "550e8400-e29b-41d4-a716-446655440002",
"responsibleId": "550e8400-e29b-41d4-a716-446655440005",
"statusId": "550e8400-e29b-41d4-a716-446655440001",
"tags": [
"urgent",
"high-priority",
"review-needed"
],
"taskTypes": [
"550e8400-e29b-41d4-a716-446655440009",
"550e8400-e29b-41d4-a716-44665544000a"
],
"teams": [
"550e8400-e29b-41d4-a716-446655440008"
],
"type": "Single",
"users": [
"550e8400-e29b-41d4-a716-446655440006",
"550e8400-e29b-41d4-a716-446655440007"
],
"valueGroup": "DirectValue"
}'const response = await fetch("https://leadtime.app/api/public/projects/string", {
method: "PATCH",
headers: {
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
},
body: JSON.stringify({
"activities": [
"550e8400-e29b-41d4-a716-44665544000b",
"550e8400-e29b-41d4-a716-44665544000c"
],
"categoryId": "550e8400-e29b-41d4-a716-446655440000",
"customFields": {
"customField1": "updated value",
"customField2": 456
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440004",
"description": "<h1>Updated Description</h1><p>This is the updated project description.</p>",
"enableExpressQuotations": false,
"guestAccess": true,
"icon": "🎯",
"name": "Website Redesign v2",
"organizationId": "550e8400-e29b-41d4-a716-446655440003",
"phaseId": "550e8400-e29b-41d4-a716-446655440002",
"responsibleId": "550e8400-e29b-41d4-a716-446655440005",
"statusId": "550e8400-e29b-41d4-a716-446655440001",
"tags": [
"urgent",
"high-priority",
"review-needed"
],
"taskTypes": [
"550e8400-e29b-41d4-a716-446655440009",
"550e8400-e29b-41d4-a716-44665544000a"
],
"teams": [
"550e8400-e29b-41d4-a716-446655440008"
],
"type": "Single",
"users": [
"550e8400-e29b-41d4-a716-446655440006",
"550e8400-e29b-41d4-a716-446655440007"
],
"valueGroup": "DirectValue"
})
});import requests
response = requests.patch(
"https://leadtime.app/api/public/projects/string",
headers={
"Authorization": "Bearer YOUR_ACCESS_TOKEN",
"Content-Type": "application/json"
},
json={
"activities": [
"550e8400-e29b-41d4-a716-44665544000b",
"550e8400-e29b-41d4-a716-44665544000c"
],
"categoryId": "550e8400-e29b-41d4-a716-446655440000",
"customFields": {
"customField1": "updated value",
"customField2": 456
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440004",
"description": "<h1>Updated Description</h1><p>This is the updated project description.</p>",
"enableExpressQuotations": False,
"guestAccess": True,
"icon": "🎯",
"name": "Website Redesign v2",
"organizationId": "550e8400-e29b-41d4-a716-446655440003",
"phaseId": "550e8400-e29b-41d4-a716-446655440002",
"responsibleId": "550e8400-e29b-41d4-a716-446655440005",
"statusId": "550e8400-e29b-41d4-a716-446655440001",
"tags": [
"urgent",
"high-priority",
"review-needed"
],
"taskTypes": [
"550e8400-e29b-41d4-a716-446655440009",
"550e8400-e29b-41d4-a716-44665544000a"
],
"teams": [
"550e8400-e29b-41d4-a716-446655440008"
],
"type": "Single",
"users": [
"550e8400-e29b-41d4-a716-446655440006",
"550e8400-e29b-41d4-a716-446655440007"
],
"valueGroup": "DirectValue"
},
)Response
{
"activities": [
"550e8400-e29b-41d4-a716-44665544000c",
"550e8400-e29b-41d4-a716-44665544000d"
],
"archivedAt": null,
"categoryId": "550e8400-e29b-41d4-a716-446655440001",
"color": "#FF5733",
"createdAt": "2024-01-01T00:00:00.000Z",
"customFields": {
"customField1": "value1",
"customField2": 123
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440005",
"description": "<h1>Project Description</h1><p>This is a comprehensive project.</p>",
"editedAt": "2024-01-15T10:30:00.000Z",
"enableExpressQuotations": false,
"guestAccess": false,
"icon": "🚀",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": false,
"name": "Website Redesign",
"organization": {
"color": "#FF5733",
"name": "ACME Corporation",
"shortName": "ACME"
},
"organizationId": "550e8400-e29b-41d4-a716-446655440004",
"phaseId": "550e8400-e29b-41d4-a716-446655440003",
"responsibleId": "550e8400-e29b-41d4-a716-446655440006",
"shortName": "ACME-123",
"shortNumber": 123,
"statusId": "550e8400-e29b-41d4-a716-446655440002",
"tags": [
"urgent",
"high-priority"
],
"taskTypes": [
"550e8400-e29b-41d4-a716-44665544000a",
"550e8400-e29b-41d4-a716-44665544000b"
],
"teams": [
"550e8400-e29b-41d4-a716-446655440009"
],
"type": "Single",
"users": [
"550e8400-e29b-41d4-a716-446655440007",
"550e8400-e29b-41d4-a716-446655440008"
],
"valueGroup": "DirectValue"
}Unauthorized - Invalid or missing authentication token
Forbidden - Insufficient API scopes or permissions
Project not found