Projects
The Project entity is the central resource in InLoox. Every task, time entry, document, and financial record is associated with a project. Use the endpoints below to create, read, update, and delete projects, manage members, categories, planning snapshots, and more.
To access custom fields on projects, query the DynamicProject endpoint instead. It returns all standard properties plus any user-defined fields configured in your InLoox environment.
Data Model
| Property | Type | Description |
|---|---|---|
ProjectId | guid | Unique identifier of the project. |
Name | string | Display name of the project. |
NumberPrefix | string | Prefix portion of the project number. |
NumberIncremential | string | Auto-incremented portion of the project number. |
NumberSuffix | string | Suffix portion of the project number. |
Number | string | Full computed project number (prefix + increment + suffix). |
ClientId | guid? | ID of the associated client / customer. |
DivisionId | guid? | ID of the division (business unit) this project belongs to. |
ProjectStatusId | guid? | ID of the current project status. |
ComputedProgress | double? | Auto-calculated project progress (0.0–1.0). |
Priority | int? | Priority level of the project. |
LockMode | int? | Lock mode flag. Controls how the project is locked. |
IsLocked | bool | Whether the project is currently locked for editing. |
StartDate | datetime? | Actual start date of the project. |
EndDate | datetime? | Actual end date of the project. |
PlannedStartDate | datetime? | Planned start date. |
PlannedEndDate | datetime? | Planned end date. |
IsEndDateFixed | bool | Whether the end date is fixed and should not shift during scheduling. |
Private | bool | If true, only assigned members can see this project. |
IsRecycled | bool | Whether the project has been moved to the recycle bin. |
IsArchived | bool | Whether the project is archived. |
IsRequest | bool | Whether this project is still a request (not yet approved). |
CreatedByContactId | guid? | ID of the contact who created the project. |
ChangedByContactId | guid? | ID of the contact who last modified the project. |
ImageId | guid? | ID of the project image/avatar. |
PortfolioId | guid? | ID of the portfolio this project belongs to. |
DescriptionText | string | Plain-text project description. |
DescriptionHTML | string | HTML-formatted project description. |
Categories | string | Comma-separated list of assigned category names. |
Note | string | Project notes (plain text). |
BackwardScheduling | bool | If true, the project is scheduled backward from the end date. |
Endpoints
CRUD Operations
/odata/ProjectList all projects
Returns a collection of all projects the authenticated user has access to. Supports OData query options such as $filter, $select, $orderby, $top, and $skip.
/odata/Project({key})Get a single project by ID
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The unique project ID. |
/odata/ProjectCreate a new project
Send a JSON body with the project properties. At minimum, provide a Name.
{
"Name": "Website Redesign",
"PlannedStartDate": "2025-03-01T00:00:00Z",
"PlannedEndDate": "2025-06-30T00:00:00Z",
"Private": false
}
Omit ProjectId to let the server generate one automatically, or supply your own GUID.
/odata/Project({key})Update an existing project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID to update. |
Send only the properties you want to change.
{
"Name": "Website Redesign v2",
"Priority": 1
}
/odata/Project({key})Delete a project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID to delete. |
Deleting a project permanently removes it and all associated data (tasks, time entries, documents, etc.). This action cannot be undone.
/odata/Project/$countGet total number of projects
Returns the count as a plain integer. Supports $filter to count a subset.
Members & Contacts
/odata/Project({key})/AddMemberAdd a member to the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"ContactId": "a1b2c3d4-...",
"RoleId": "e5f6a7b8-..."
}
/odata/Project({key})/RemoveMemberRemove a member from the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"ContactId": "a1b2c3d4-..."
}
/odata/Project({key})/GetProjectContactRelations()Get all contact relations for a project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
Returns a list of contacts associated with the project, including their roles.
Categories
/odata/Project({key})/GetAssignedCategories()Get categories assigned to a project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
/odata/Project({key})/SetCategoriesSet categories on a project (replaces existing)
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"CategoryIds": ["cat-id-1", "cat-id-2"]
}
SetCategories replaces all existing category assignments. To add or remove a single category, use AssignCategory or UnAssignCategory instead.
/odata/Project({key})/AssignCategory(categoryId={categoryId})Assign a single category to the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
categoryId | guid | ✅ | The category ID to assign. |
/odata/Project({key})/UnAssignCategory(categoryId={categoryId})Remove a single category from the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
categoryId | guid | ✅ | The category ID to remove. |
Notes
/odata/Project({key})/AddNoteAdd a note to the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"Text": "Kickoff meeting scheduled for next Monday."
}
/odata/Project({key})/DeleteNoteDelete a note from the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"NoteRelationId": "note-relation-guid"
}
Project Number
/odata/Project({key})/UpdateProjectNumberUpdate the project number components
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"NumberPrefix": "PRJ",
"NumberIncremential": "0042",
"NumberSuffix": "-A"
}
/odata/Project({key})/CheckIfProjectNumberExists(projectNumber={projectNumber})Check whether a project number is already in use
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID (context). |
projectNumber | string | ✅ | The full project number to check. |
Returns true if the number already exists, false otherwise.
/odata/Project({key})/CorrectIncrementIfNecessary(projectNumber={projectNumber})Auto-correct the incremental part to avoid duplicates
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
projectNumber | string | ✅ | The project number to validate. |
Status & Actions
/odata/Project({key})/ApproveRequestApprove a project request
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID (must be a request). |
Converts a project request into an active project.
/odata/Project({key})/RejectRequestReject a project request
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID (must be a request). |
/odata/Project({key})/ToggleFavorite(isFavorite={isFavorite})Add or remove a project from favorites
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
isFavorite | bool | ✅ | Set to true to mark as favorite, false to remove. |
/odata/Project({key})/CopyProject()Create a copy of the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The source project ID to copy. |
Returns the newly created project.
/odata/Project({key})/GenerateImage()Generate a project image
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
/odata/Project({key})/GenerateProjectDescription(language={language})Auto-generate a project description
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
language | string | ✅ | Language code for the generated description (e.g., 'en', 'de'). |
Planning Snapshots
Planning snapshots let you capture and compare the state of a project plan at a specific point in time.
/odata/Project({key})/CreatePlanningSnapshot(name={name})Create a new planning snapshot
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
name | string | ✅ | Name for the snapshot (e.g., 'Baseline Q1'). |
/odata/Project({key})/DeletePlanningSnapshotDelete an existing planning snapshot
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"SnapshotId": "snapshot-guid"
}
/odata/Project({key})/RenamePlanningSnapshotRename an existing planning snapshot
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"SnapshotId": "snapshot-guid",
"Name": "Updated Baseline Name"
}
Project Groups
/odata/Project({key})/AddProjectGroupAdd a new group to the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"Name": "Phase 1"
}
/odata/Project({key})/DeleteProjectGroupDelete a project group
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"GroupId": "group-guid"
}
/odata/Project({key})/SetProjectGroupColorSet the color of a project group
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"GroupId": "group-guid",
"Color": "#FF5733"
}
Relations
/odata/Project({key})/AddRelationAdd a relation to another entity
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"TargetId": "target-entity-guid",
"RelationType": "RelatedTo"
}
/odata/Project({key})/RemoveRelationRemove an existing relation
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"RelationId": "relation-guid"
}
Notification Followers
Notification followers receive updates when the project changes.
/odata/Project({key})/AddNotificationFollowersAdd notification followers to the project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"ContactIds": ["contact-id-1", "contact-id-2"]
}
/odata/Project({key})/RemoveNotificationFollowerRemove a notification follower
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
{
"ContactId": "contact-guid"
}
/odata/Project({key})/GetNotificationFollowerContacts()Get all notification followers for a project
| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The project ID. |
Custom Fields — DynamicProject
The standard Project endpoint only returns built-in properties. To read or write custom fields (user-defined fields configured in InLoox), use the DynamicProject endpoint instead:
GET /odata/DynamicProject
GET /odata/DynamicProject({key})
DynamicProject returns all standard project properties plus any custom fields. Custom field names follow the pattern CF_<FieldName>.
DynamicProject only supports GET requests. To create or update projects, use the regular /odata/Project endpoints.
OData Query Examples
Filtering & Selecting
Retrieve active projects that are not archived, selecting only key fields:
curl -X GET "https://{tenant}.inloox.app/odata/Project?\
$filter=IsArchived eq false and IsRecycled eq false\
&$select=ProjectId,Name,Number,StartDate,EndDate,ComputedProgress\
&$orderby=Name asc\
&$top=50" \
-H "Authorization: Bearer {token}" \
-H "Accept: application/json"
Paging
Use $top and $skip for server-side paging:
# Page 1
curl -X GET "https://{tenant}.inloox.app/odata/Project?$top=20&$skip=0" \
-H "Authorization: Bearer {token}"
# Page 2
curl -X GET "https://{tenant}.inloox.app/odata/Project?$top=20&$skip=20" \
-H "Authorization: Bearer {token}"
Filtering by Date
curl -X GET "https://{tenant}.inloox.app/odata/Project?\
$filter=PlannedStartDate ge 2025-01-01T00:00:00Z\
and PlannedEndDate le 2025-12-31T23:59:59Z" \
-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);
// List active projects
var response = await client.GetAsync(
"https://{tenant}.inloox.app/odata/Project?" +
"$filter=IsArchived eq false and IsRecycled eq false" +
"&$select=ProjectId,Name,Number,ComputedProgress" +
"&$orderby=Name asc&$top=100");
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);
// Create a project
var payload = new StringContent(
"""{"Name":"New API Project","Private":false}""",
System.Text.Encoding.UTF8,
"application/json");
var createResponse = await client.PostAsync(
"https://{tenant}.inloox.app/odata/Project", payload);
Use $select to request only the properties you need. This reduces response size and improves performance, especially for large project lists.