Create project
Creates a new project in the workspace.
Project Types:
- Single Projects: One-off initiatives with defined start and finish
- Ongoing Projects: Continuous activities with recurring tasks
Internal vs External:
- External Projects: Set organizationId to link to a client organization. These are billable customer projects.
- Internal Projects: Set organizationId to null. These are non-billable company activities.
Required Fields:
- name: Project name
- type: Project type (Single or Ongoing)
- valueGroup: Value classification (A-D)
- categoryId: Project category UUID
- statusId: Project status UUID
- users: Array of user IDs (at least one)
- taskTypes: Array of task type IDs (at least one)
- activities: Array of activity IDs (at least one)
Reference Data:
- categoryId: use GET /projects/categories
- statusId: use GET /projects/statuses
- phaseId: use GET /projects/phases
- organizationId: use GET /organizations
- users/defaultAccountableId/responsibleId: use User.id from GET /workspace/users
- teams: use GET /teams
- taskTypes: use GET /tasks/types or GET /administration/task-settings/types
- activities: use GET /administration/task-settings/activities
- customFields: use configured project custom-field IDs from GET /administration/project-settings/custom-fields; values must match their definition types and do not create native scheduling, relationship, or billing behavior
Optional Fields:
- phaseId: Required for external single projects, optional otherwise
- organizationId: Required for external projects, must be null for internal projects
- description: HTML or Markdown (will be converted to internal format)
- icon: Icon identifier in the format
:icon_name:(e.g.,:rocket:,:shopping_cart:,:mobile_phone:). Use standard emoji short names or custom icon names. - deadline: ISO 8601 date string
- defaultAccountableId: Default accountable user UUID
- responsibleId: Responsible user UUID
- teams: Array of team IDs
- customFields: Key-value pairs keyed by configured project custom-field ID; values must match each definition type
- tags: Array of tag strings
- guestAccess: Whether organization members can access (only for external projects)
Description Format: The description field accepts HTML or Markdown and will be automatically converted to the internal IDoc format. When retrieved later, it will be returned as HTML.
POST
/projectsAuthorization
AuthorizationOAuth2 access token · headerrequiredScopes:
api:writeor
AuthorizationBearer token (JWT) · headerrequiredQuery 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[]requiredArray of time activity UUIDs that can be used when logging time in this project (e.g., Development, Testing, Management, Research). At least one activity must be specified. Use GET /administration/task-settings/activities to retrieve available activities.
categoryIdstringrequiredUUID of the project category. Categories classify projects by functional area or project type (e.g., Onboarding, Support, Implementation). Use the GET /projects/categories endpoint to retrieve available categories.
customFieldsobjectrequiredCustom field values as key-value pairs. Keys should match custom field IDs configured in workspace settings. Values must match the field type (string, number, boolean, date, etc.). Use GET /administration/project-settings/custom-fields to retrieve available project custom fields and their configurations.
deadlineobjectProject deadline date in ISO 8601 format (e.g., "2024-12-31T23:59:59.000Z"). Optional target completion date for the project.
defaultAccountableIdobjectUUID of the user who is accountable for the project by default. This user will be set as accountable on new tasks created in this project unless overridden. Use the GET /workspace/users endpoint to retrieve available users.
descriptionstringrequiredAccepts 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>
```
The description will be automatically converted from HTML/Markdown to the internal IDoc format. When retrieved later via GET, it will be returned as HTML. Also accepts ProseMirror IDoc JSON (object or string).
guestAccessbooleanrequiredWhether organization members (guests) can access this project. Only applicable for external (client) projects. When enabled, members of the linked organization can view and interact with the project and its tasks.
default: false
iconstringVisual identifier for the project. Must be in the format `:icon_name:` (e.g., `:rocket:`, `:shopping_cart:`, `:mobile_phone:`). This icon is displayed in project lists and throughout the application. You can use standard emoji short names (e.g., `:rocket:` for 🚀, `:shopping_cart:` for 🛒) or custom icon names created in the workspace.
namestringrequiredFull name of the project. This is the primary display name used throughout the application.
organizationIdobjectUUID of the organization (client). Required for external projects - must be set to link the project to a client organization. Must be null for internal projects. Use the GET /organizations endpoint to retrieve available organizations.
phaseIdobjectUUID of the project phase. Phases represent distinct stages within a project lifecycle (e.g., Planning, Development, Testing). Required for external single projects, optional otherwise. Use the GET /projects/phases endpoint to retrieve available phases.
responsibleIdobjectUUID of the user who is responsible for the project (e.g., project manager, sales manager). Use the GET /workspace/users endpoint to retrieve available users.
statusIdstringrequiredUUID of the project status. Statuses represent the current progress stage of a project (e.g., Sales, Implementation, Billing, Done). Use the GET /projects/statuses endpoint to retrieve available statuses.
tagsstring[]Array of tag strings for categorizing and filtering projects. Tags can represent topics, teams, or work types. Tags make it easier to filter and organize projects in the project overview.
taskTypesstring[]requiredArray of task type UUIDs that can be used in this project (e.g., Feature, Bug, Management, Server issue). At least one task type must be specified. Use GET /tasks/types or GET /administration/task-settings/types to retrieve available task types.
teamsstring[]Array of team UUIDs assigned to the project. All members of these teams will have access to the project. Use the GET /teams endpoint to retrieve available teams.
typestringrequiredProject type determines the project structure and workflow. Single projects are one-off initiatives with defined start and finish, usually planned and billed as quoted. Ongoing projects are continuous activities where tasks are handled and billed based on effort.
Allowed:
SingleSupportusersstring[]requiredArray of user UUIDs who are direct project members and have access to this project. These users can see the project, be assigned to project tasks, create or edit tasks, and log time on tasks in the project. Include every employee who should work on, be assigned to, or log time on this project; do not include only managers unless managers are the only people who need project access. At least one user must be assigned. Use the GET /workspace/users endpoint to retrieve available users.
valueGroupstringrequiredValue group classification indicates how the project contributes to value creation. A - Direct value creation (external customer projects), B - Indirect value creation (internal projects that increase product/service value), C - Not value creating (administrative tasks), D - Waste (unproductive time).
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:
DirectValueIndirectValueNonValueWaste400Validation errors
errorsobjectmessagestringstatusCodenumber401Unauthorized - Invalid or missing authentication token
403Forbidden - Insufficient API scopes or permissions
Request
curl -X POST "https://leadtime.app/api/public/projects" \
-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": "value1",
"customField2": 123
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440004",
"description": "<h1>Project Description</h1><p>This is a comprehensive project for redesigning our company website.</p>",
"guestAccess": false,
"icon": ":rocket:",
"name": "Website Redesign",
"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"
],
"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", {
method: "POST",
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": "value1",
"customField2": 123
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440004",
"description": "<h1>Project Description</h1><p>This is a comprehensive project for redesigning our company website.</p>",
"guestAccess": false,
"icon": ":rocket:",
"name": "Website Redesign",
"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"
],
"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.post(
"https://leadtime.app/api/public/projects",
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": "value1",
"customField2": 123
},
"deadline": "2024-12-31T23:59:59.000Z",
"defaultAccountableId": "550e8400-e29b-41d4-a716-446655440004",
"description": "<h1>Project Description</h1><p>This is a comprehensive project for redesigning our company website.</p>",
"guestAccess": False,
"icon": ":rocket:",
"name": "Website Redesign",
"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"
],
"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"
}{
"errors": {
"name": [
"Name is required"
],
"organizationId": [
"organizationId is required for client projects"
],
"type": [
"Type is required"
]
},
"message": "Bad Request",
"statusCode": 400
}Unauthorized - Invalid or missing authentication token
Forbidden - Insufficient API scopes or permissions