Skip to main content

Tasks

The Task entity represents work items within a project. Tasks can be organized on Kanban boards or in list views, assigned to contacts, tracked with stopwatches, and linked to documents and other entities.

info

To access custom fields on tasks, query the DynamicTaskItem endpoint. It returns all standard properties plus any user-defined fields.


Data Model

PropertyTypeDescription
TaskItemIdguidUnique identifier of the task.
NamestringDisplay name / title of the task.
TaskItemStatusIdguid?ID of the task status (e.g., Open, In Progress, Done).
ContactIdguid?ID of the contact the task is assigned to.
ProjectIdguid?ID of the project this task belongs to.
PlanningIdguid?ID of the linked planning element (work package).
GroupIdguid?ID of the task group (Kanban column / category).
StartDateTimedatetime?Scheduled start date and time.
EndDateTimedatetime?Scheduled end date and time.
IsDoneboolWhether the task is marked as completed.
DoneDatedatetime?Date and time when the task was completed.
WorkAmountdouble?Total effort estimate in hours.
CustomColorstringHex color code for visual highlighting (e.g., '#FF5733').
CardPositionNumberint?Sort order position within a Kanban column.
RiskNamestringName of the associated risk.
RiskIdguid?ID of the associated risk entity.
AssignedByContactIdguid?ID of the contact who assigned this task.
CreatedByContactIdguid?ID of the contact who created this task.
ContactDisplayNamestringDisplay name of the assigned contact (read-only).
ContactImageIdguid?Image ID of the assigned contact (read-only).
DescriptionHTMLstringHTML-formatted task description.
RecurrencestringRecurrence rule string (iCal RRULE format) if the task repeats.
IsBillableboolWhether work on this task is billable.
ChecklistItemsCountintTotal number of checklist items (read-only).
CheckListItemsDoneCountintNumber of completed checklist items (read-only).
CheckListItemsOpenCountintNumber of open checklist items (read-only).
ContributorsCountintNumber of contributors assigned to this task (read-only).
ContributorsWorkAmountdouble?Combined effort of all contributors in hours (read-only).
WorkAmountOwnerdouble?Effort assigned to the primary owner in hours.

Endpoints

CRUD Operations

GET/odata/Task

List all tasks

Returns all tasks the authenticated user has access to. Supports OData query options.


GET/odata/Task({key})

Get a single task by ID

ParameterTypeRequiredDescription
keyguidThe unique task ID.

POST/odata/Task

Create a new task

{
"Name": "Design mockups",
"ProjectId": "project-guid",
"ContactId": "assignee-contact-guid",
"StartDateTime": "2025-04-01T09:00:00Z",
"EndDateTime": "2025-04-05T17:00:00Z",
"IsBillable": true
}

PATCH/odata/Task({key})

Update an existing task

ParameterTypeRequiredDescription
keyguidThe task ID to update.

Send only the properties you want to change:

{
"IsDone": true,
"DoneDate": "2025-04-04T16:30:00Z"
}

DELETE/odata/Task({key})

Delete a task

ParameterTypeRequiredDescription
keyguidThe task ID to delete.

GET/odata/Task/$count

Get total number of tasks

Returns the count as a plain integer. Supports $filter.


Batch Operations

POST/odata/Task/BatchInsert

Create multiple tasks in a single request

{
"Tasks": [
{ "Name": "Task A", "ProjectId": "project-guid" },
{ "Name": "Task B", "ProjectId": "project-guid" }
]
}
tip

Use batch operations to reduce round-trips when creating or deleting many tasks at once.


POST/odata/Task/BatchDelete

Delete multiple tasks in a single request

{
"TaskItemIds": ["task-id-1", "task-id-2", "task-id-3"]
}
warning

Batch delete permanently removes all specified tasks. This action cannot be undone.


Task Management

POST/odata/Task({key})/MoveTaskItem

Move a task to a different group or position

ParameterTypeRequiredDescription
keyguidThe task ID to move.
{
"GroupId": "target-group-guid",
"CardPositionNumber": 2
}

POST/odata/Task({key})/UpdateProjectDefinedField

Update a project-defined field on the task

ParameterTypeRequiredDescription
keyguidThe task ID.

POST/odata/Task({key})/Copy

Create a copy of the task

ParameterTypeRequiredDescription
keyguidThe source task ID to copy.

Returns the newly created task.


Notes

POST/odata/Task({key})/AddNote

Add a note to the task

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"Text": "Waiting for design approval before proceeding."
}

GET/odata/Task/DeleteNote(noteRelationId={noteRelationId})

Delete a note from a task

ParameterTypeRequiredDescription
noteRelationIdguidThe note relation ID to delete.

Contributors

Contributors are additional contacts assigned to work on a task alongside the primary owner.

GET/odata/Task({key})/GetContributors()

Get all contributors for a task

ParameterTypeRequiredDescription
keyguidThe task ID.

POST/odata/Task({key})/AddContributor

Add a contributor to the task

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"ContactId": "contributor-contact-guid",
"WorkAmount": 8.0
}

POST/odata/Task({key})/UpdateContributor

Update a contributor's details

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"ContactId": "contributor-contact-guid",
"WorkAmount": 12.0
}

POST/odata/Task({key})/RemoveContributor

Remove a contributor from the task

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"ContactId": "contributor-contact-guid"
}

Stopwatch

The stopwatch feature allows time tracking directly from a task.

GET/odata/Task({key})/GetStopwatch()

Get the current stopwatch state

ParameterTypeRequiredDescription
keyguidThe task ID.

Returns the current stopwatch status, elapsed time, and state (running, paused, stopped).


POST/odata/Task({key})/StartStopwatch

Start the stopwatch

ParameterTypeRequiredDescription
keyguidThe task ID.

POST/odata/Task({key})/PauseStopwatch

Pause the stopwatch

ParameterTypeRequiredDescription
keyguidThe task ID.

POST/odata/Task({key})/StopStopwatch

Stop the stopwatch and create a time entry

ParameterTypeRequiredDescription
keyguidThe task ID.
info

Stopping the stopwatch automatically creates a time entry with the recorded duration.


Documents

POST/odata/Task({key})/AddDocumentToTaskItem

Link a document to the task

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"DocumentId": "document-guid"
}

POST/odata/Task({key})/RemoveDocumentFromTaskItem

Remove a document link from the task

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"DocumentId": "document-guid"
}

Relations

POST/odata/Task({key})/AddRelation

Add a relation to another entity

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"TargetId": "target-entity-guid",
"RelationType": "RelatedTo"
}

POST/odata/Task({key})/RemoveRelation

Remove an existing relation

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"RelationId": "relation-guid"
}

Calendar Sync

Synchronize tasks with external calendar systems.

GET/odata/Task({key})/GetCalendarSyncStatus()

Get the calendar sync status

ParameterTypeRequiredDescription
keyguidThe task ID.

POST/odata/Task({key})/EnableCalendarSync

Enable calendar synchronization for the task

ParameterTypeRequiredDescription
keyguidThe task ID.

POST/odata/Task({key})/DisableCalendarSync

Disable calendar synchronization for the task

ParameterTypeRequiredDescription
keyguidThe task ID.

Notification Followers

POST/odata/Task({key})/AddNotificationFollowers

Add notification followers to the task

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"ContactIds": ["contact-id-1", "contact-id-2"]
}

POST/odata/Task({key})/RemoveNotificationFollower

Remove a notification follower

ParameterTypeRequiredDescription
keyguidThe task ID.
{
"ContactId": "contact-guid"
}

GET/odata/Task({key})/GetNotificationFollowerContacts()

Get all notification followers for a task

ParameterTypeRequiredDescription
keyguidThe task ID.

Custom Fields — DynamicTaskItem

Use the DynamicTaskItem endpoint to access tasks with custom fields:

GET /odata/DynamicTaskItem
GET /odata/DynamicTaskItem({key})

Custom field names follow the pattern CF_<FieldName>.

warning

DynamicTaskItem only supports GET requests. To create or update tasks, use the regular /odata/Task endpoints.


OData Query Examples

Filter Tasks by Project

curl -X GET "https://{tenant}.inloox.app/odata/Task?\
$filter=ProjectId eq {project-guid}\
&$select=TaskItemId,Name,IsDone,ContactDisplayName\
&$orderby=CardPositionNumber asc" \
-H "Authorization: Bearer {token}"

Open Tasks Assigned to a Specific Contact

curl -X GET "https://{tenant}.inloox.app/odata/Task?\
$filter=ContactId eq {contact-guid} and IsDone eq false\
&$orderby=EndDateTime asc" \
-H "Authorization: Bearer {token}"

Paging

curl -X GET "https://{tenant}.inloox.app/odata/Task?\
$top=25&$skip=0&$orderby=Name asc" \
-H "Authorization: Bearer {token}"

C# Example

using System.Net.Http;
using System.Net.Http.Headers;

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);

// Get open tasks for a project
var response = await client.GetAsync(
"https://{tenant}.inloox.app/odata/Task?" +
$"$filter=ProjectId eq {projectId} and IsDone eq false" +
"&$select=TaskItemId,Name,ContactDisplayName,EndDateTime" +
"&$orderby=EndDateTime asc");

var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);

// Create a task
var payload = new StringContent(
"""
{
"Name": "Review documentation",
"ProjectId": "{project-guid}",
"ContactId": "{contact-guid}",
"IsBillable": true
}
""",
System.Text.Encoding.UTF8,
"application/json");

var createResponse = await client.PostAsync(
"https://{tenant}.inloox.app/odata/Task", payload);
tip

Combine $filter with $select to minimize payload size. For tasks, filtering by ProjectId and IsDone is the most common pattern.