Projects
The Project entity is the central object in InLoox. Via the OData API you can create, update, delete projects and perform extensive actions such as member management, categorization, or planning versions.
All endpoints use the base path /odata/Project. For the dynamic list view including custom fields, /odata/DynamicProject is available.
Data Model
The following table shows the key properties of the ApiProject entity:
| Property | Type | Description |
|---|---|---|
ProjectId | Guid (UUID) | Unique identifier of the project (primary key). |
Name | string | Name of the project. |
NumberPrefix | string? | Prefix of the project number. |
NumberIncremential | int32? | Sequential number of the project number. |
NumberSuffix | string? | Suffix of the project number. |
Number | string? | Calculated full project number (prefix + sequential number + suffix, read-only). |
ProjectNumberAndName | string? | Combined project number and name (read-only). |
ClientId | Guid? | Associated client (client ID). |
ClientName | string? | Name of the associated client (read-only). |
ClientNumber | string? | Client number (read-only). |
ClientNumberName | string? | Combined client number and name (read-only). |
DivisionId | Guid? | Associated division. |
DivisionName | string? | Name of the division (read-only). |
DivisionDescription | string? | Description of the division (read-only). |
ProjectStatusId | Guid? | Current project status (foreign key). |
ProjectStatusName | string? | Name of the current project status (read-only). |
ProjectStatusProgress | int32? | Progress value of the project status (read-only). |
StatusLabel | string? | Display label for the project status (read-only). |
ComputedProgress | double? | Calculated progress (0–1, read-only). |
PercentComplete | int32? | Completion percentage (read-only). |
Complete | int32 | Number of completed tasks (read-only). |
CompleteActual | double | Actual completion rate (read-only). |
CompletePlan | int32 | Number of planned completed tasks (read-only). |
CompletePlanActual | int32 | Planned vs. actual completion (read-only). |
Priority | int32 | Priority of the project. Values: 0 = Low, 1 = Normal, 2 = High. Default is 1 (Normal). |
LockMode | int32 | Lock mode. Values: 0 = None, 1 = Locked, 2 = No Notifications. |
IsLocked | boolean | Indicates whether the project is locked. |
StartDate | DateTimeOffset | Start date. |
EndDate | DateTimeOffset | End date. |
PlannedStartDate | DateTimeOffset? | Planned start date. |
PlannedEndDate | DateTimeOffset? | Planned end date. |
IsEndDateFixed | boolean | Indicates whether the end date is fixed. |
BackwardScheduling | boolean | Backward scheduling enabled. |
IsRecycled | boolean | Indicates whether the project is in the recycle bin. |
IsArchived | boolean | Indicates whether the project is archived. |
IsRequest | boolean | Indicates whether this is a project request. |
IsFavorite | boolean? | Indicates whether the project is marked as a favorite by the current user. |
CreatedByContactId | Guid | Contact ID of the creator. |
CreatedByName | string? | Display name of the creator (read-only). |
CreatedByContactImageId | Guid? | Image ID of the creator contact (read-only). |
CreatedDateTime | DateTimeOffset? | Creation date and time (read-only). |
ChangedByContactId | Guid? | Contact ID of the last editor. |
LastChangedByName | string? | Display name of the last editor (read-only). |
ChangedByContactImageId | Guid? | Image ID of the last editor contact (read-only). |
LastChangedDateTime | DateTimeOffset? | Date and time of the last change (read-only). |
ClosedByName | string? | Display name of the contact who closed the project (read-only). |
ClosedDateTime | DateTimeOffset? | Date and time the project was closed (read-only). |
ImageId | Guid? | ID of the project image. |
PortfolioId | Guid? | Associated portfolio. |
DescriptionText | string? | Project description as plain text. |
DescriptionHTML | string? | Project description as HTML. |
Categories | string? | Comma-separated categories. |
Note | string? | Project note. |
NotificationsSuppressed | boolean | Notifications suppressed. |
ClusterName | string? | Name of the cluster the project is assigned to (read-only). |
StoreType | int32 | Document storage type of the project. |
DocumentFolder | string? | Path to the project document folder. |
FirstManager | string? | Display name of the first manager (read-only). |
FirstTeamMember | string? | Display name of the first team member (read-only). |
FirstCustomer | string? | Display name of the first customer contact (read-only). |
FirstPartner | string? | Display name of the first partner contact (read-only). |
FirstAdditionalContact | string? | Display name of the first additional contact (read-only). |
ManagerProjectContact | string? | Comma-separated list of manager names (read-only). |
TeamProjectContact | string? | Comma-separated list of team member names (read-only). |
CustomerProjectContact | string? | Comma-separated list of customer contact names (read-only). |
PartnerProjectContact | string? | Comma-separated list of partner contact names (read-only). |
AdditionalProjectContact | string? | Comma-separated list of additional contact names (read-only). |
ReviewerProjectContact | string? | Comma-separated list of reviewer contact names (read-only). |
AmountPlannedCosts | double | Total amount of planned costs (read-only). |
AmountActualCosts | double | Total amount of actual costs (read-only). |
AmountPlannedProfit | double | Total planned profit (read-only). |
AmountProfit | double | Total actual profit (read-only). |
AmountProfitDifference | double | Difference between planned and actual profit (read-only). |
PlannedCostsOpex | double | Planned operational costs (OpEx, read-only). |
ActualCostsOpex | double | Actual operational costs (OpEx, read-only). |
PlannedCostsResources | double | Planned resource costs (read-only). |
PlannedCostsOther | double | Planned other costs (read-only). |
CostsOther | double | Actual other costs (read-only). |
PlannedRevenues | double | Total planned revenues (read-only). |
Revenues | double | Total actual revenues (read-only). |
ActivityCostAmount | double | Total amount of activity-based costs (read-only). |
PlannedWorkAmount | double | Total planned work effort in hours (read-only). |
BudgetIndicator | boolean? | Indicates whether a budget indicator is set (read-only). |
AllPositionsBilled | boolean? | Indicates whether all positions are billed (read-only). |
TotalEffort | double? | Total effort of all tasks in hours (read-only). |
TotalEffortComplete | double? | Effort of completed tasks in hours (read-only). |
TotalEffortRemaining | double? | Remaining effort in hours (read-only). |
TotalEffortPlan | double? | Total planned effort in hours (read-only). |
TotalEffortOverdue | int32 | Number of overdue efforts (read-only). |
TotalEffortPlanDue | int32 | Number of planned due efforts (read-only). |
TotalEffortTimeEntries | double? | Total effort from time entries in hours (read-only). |
TimeEntriesDuration | double | Total duration of time entries in hours (read-only). |
UnassignedTimeEntriesDuration | double | Duration of unassigned time entries (read-only). |
ProjectDuration | double | Total project duration in days (read-only). |
ProjectDurationRemaining | double | Remaining project duration in days (read-only). |
PlannedDuration | double | Planned project duration in days (read-only). |
PlannedDurationRemaining | double | Remaining planned duration in days (read-only). |
FirstNotCompletedPlanningDate | DateTimeOffset? | Date of the first incomplete planning element (read-only). |
TimeWarningPlanningEndExceeded | boolean? | Indicates whether the planning end date has been exceeded (read-only). |
TimeWarningProjectEndExceeded | boolean? | Indicates whether the project end date has been exceeded (read-only). |
RiskScore | int32 | Risk assessment score (read-only). |
ValueScore | int32 | Value assessment score (read-only). |
SizeScore | int32 | Size assessment score (read-only). |
CalculatedScore | double | Calculated total score (read-only). |
Fields marked as read-only are calculated server-side and cannot be set via POST or PATCH requests. Use them for filtering, sorting, and display in GET requests.
Endpoints
CRUD Operations
Retrieve all projects
/odata/ProjectSupports OData query parameters ($filter, $select, $orderby, $top, $skip).
Retrieve a single project by its ID
/odata/Project({key})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId of the project. |
Create a new project
/odata/Project| Parameter | Type | Required | Description |
|---|---|---|---|
Body | Delta<ApiProject> | ✅ | JSON object with the project properties. |
Omit ProjectId to let the server automatically generate an ID.
Update a project
/odata/Project({key})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId of the project. |
Body | Delta<ApiProject> | ✅ | JSON object with the fields to update. |
Delete a project
/odata/Project({key})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId of the project to delete. |
Deleting a project permanently removes it and all associated data (tasks, time entries, documents, etc.). This action cannot be undone.
Members & Contacts
Retrieve all members of a project
/odata/Project({key})/GetProjectContactRelations()| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
The response contains a list of contact relation records with the following structure:
| Property | Type | Description |
|---|---|---|
Id | guid | Unique identifier of the contact relation. |
MemberId | guid | ID of the project member. |
RoleType | int | Project role. Values: 2 = Managers, 4 = Team, 8 = Partners, 16 = Customers, 32 = Additional, 64 = Project request reviewer, 128 = Additional 1, 256 = Additional 2, 512 = Additional 3, 1024 = Additional 4, 2048 = Additional 5. |
OrdinalPosition | int | Sort position of the member. |
DisplayName | string | Display name of the contact. |
Email | string | Email address of the contact. |
SourceType | int | Type of the contact relation record. Values: 0 = Individual contact, 1 = Group of contacts. |
IsRecycled | bool | Indicates whether the contact is in the recycle bin. |
IsIdentity | bool | Indicates whether the contact has an identity (user account). |
EmailConfirmed | bool | Indicates whether the email address is confirmed. |
InvitationAccepted | bool | Indicates whether the invitation has been accepted. |
Skills | string | Comma-separated list of skills. |
ImageId | guid? | ID of the contact image. |
Add a member to the project
/odata/Project({key})/AddMember| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the following fields: contactId (guid, required) — The contact to add. role (int, required) — Value: 2 = Managers, 4 = Team, 8 = Partners, 16 = Customers, 32 = Additional, 64 = Project request reviewer, 128 = Additional 1, 256 = Additional 2, 512 = Additional 3, 1024 = Additional 4, 2048 = Additional 5. type (int?, optional) — Value: 0 = Individual contact, 1 = Group of contacts. ordinalPosition (int?, optional) — Sort position. |
Adding a member is a security-relevant action. This grants project role permissions to the specified contact.
Remove a member from the project
/odata/Project({key})/RemoveMember| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the following fields: contactId (guid, required) — The contact to remove. role (int, required) — Value: 2 = Managers, 4 = Team, 8 = Partners, 16 = Customers, 32 = Additional, 64 = Project request reviewer, 128 = Additional 1, 256 = Additional 2, 512 = Additional 3, 1024 = Additional 4, 2048 = Additional 5. type (int?, optional) — Value: 0 = Individual contact, 1 = Group of contacts. |
Removing a member is a security-relevant action. This revokes project role permissions for the specified contact.
Categories
Retrieve assigned categories of a project
/odata/Project({key})/GetAssignedCategories()Assign a category to the project
/odata/Project({key})/AssignCategory(categoryId={categoryId})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
categoryId | Guid | ✅ | The ID of the category to assign. |
Remove a category from the project
/odata/Project({key})/UnAssignCategory(categoryId={categoryId})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
categoryId | Guid | ✅ | The ID of the category to remove. |
Replace all categories of a project
/odata/Project({key})/SetCategories| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the following fields: categoryIds (guid[], required) — Array of category IDs to assign to the project. |
SetCategories replaces all existing category assignments. To add or remove a single category, use AssignCategory or UnAssignCategory instead.
Comments
The ProjectNote entity is the underlying data model for project comments. Each comment is stored as a ProjectNote and linked to a specific project.
| Property | Type | Description |
|---|---|---|
ProjectNoteId | guid | Unique ID of the note. |
ProjectId | guid | ID of the associated project. |
Note | string | Note text (plain text). |
NoteHtml | string | Note text (HTML-formatted). |
ShortDescription | string | Short description of the note. |
CreateDateTime | DateTimeOffset | Creation timestamp. |
CreatedByContactId | guid | ID of the creator. |
Retrieve all project comments across all projects
/odata/ProjectNoteFilter by project:
GET /odata/ProjectNote?$filter=ProjectId eq xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&$orderby=CreateDateTime desc
Retrieve a project comment by ID
/odata/ProjectNote({key})| Parameter | Type | Required | Description |
|---|---|---|---|
key | guid | ✅ | The ProjectNoteId. |
Add a comment to the project
/odata/Project({key})/AddNote| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the following fields: htmlText (string, required) — HTML-formatted comment content. notificationContactIds (guid[], required) — Contact IDs to be notified. Pass an empty array if no notifications are needed. |
Remove a comment from the project
/odata/Project({key})/DeleteNote| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the following fields: noteRelationId (guid, required) — The ID of the comment relation to delete. |
Deleting a comment cannot be undone.
Project Numbers
Check whether a project number already exists
/odata/Project({key})/CheckIfProjectNumberExists(projectNumber={projectNumber})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
projectNumber | string | ✅ | The project number to check. |
Update a project number
/odata/Project({key})/UpdateProjectNumber| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the following fields: prefix (string, required) — The prefix of the project number. suffix (string, required) — The suffix of the project number. |
Correct the sequential number part of the project number
/odata/Project({key})/CorrectIncrementIfNecessary(projectNumber={projectNumber})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
projectNumber | string | ✅ | The project number to reconcile. |
Status & Actions
Approve a project request
/odata/Project({key})/ApproveRequest| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId of the project request. |
Reject a project request
/odata/Project({key})/RejectRequest| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId of the project request. |
Toggle favorite status of a project
/odata/Project({key})/ToggleFavorite(isFavorite={isFavorite})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
isFavorite | boolean | ✅ | true to mark as favorite, false to remove. |
Duplicate a project
/odata/Project({key})/CopyProject()| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId of the project to copy. |
Generate a project image
/odata/Project({key})/GenerateImage()| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Generate a project description via AI
/odata/Project({key})/GenerateProjectDescription(language={language})| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
language | string | — | Language of the generated description (e.g. "de", "en"). |
This endpoint is only available in InLoox Cloud.
Relations
Add a relation to the project
/odata/Project({key})/AddRelation| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the relation details. |
Remove a relation from the project
/odata/Project({key})/RemoveRelation| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the relation ID. |
Notifications
Retrieve all contacts subscribed to notifications for this project
/odata/Project({key})/GetNotificationFollowerContacts()| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Add notification subscribers
/odata/Project({key})/AddNotificationFollowers| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the contact IDs of the subscribers. |
Remove a notification subscriber
/odata/Project({key})/RemoveNotificationFollower| Parameter | Type | Required | Description |
|---|---|---|---|
key | Guid | ✅ | The ProjectId. |
Body | object | ✅ | JSON object with the contact ID. |
DynamicProject
The /odata/DynamicProject endpoint provides a read-only, flattened view that merges data from project, portfolio, and permissions. All properties are prefixed (e.g. Project_Name, Portfolio_Name, ProjectPermission_PermissionProjectRead). Custom fields follow the pattern CF_<FieldName>.
Retrieve flattened project list with portfolio and permission data
/odata/DynamicProjectDynamicProject only supports GET requests. To create or edit, use the regular /odata/Project endpoints.
OData Query Examples
Retrieve all active projects
GET /odata/Project?$filter=IsArchived eq false and IsRecycled eq false
Filter projects by a specific client
GET /odata/Project?$filter=ClientId eq 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
Sort projects by priority (descending)
GET /odata/Project?$orderby=Priority desc&$top=10
Select specific fields only
GET /odata/Project?$select=ProjectId,Name,Number,StartDate,EndDate,ComputedProgress
Filter project requests
GET /odata/Project?$filter=IsRequest eq true
Create a project
POST /odata/Project
Content-Type: application/json
{
"Name": "New Project",
"StartDate": "2025-01-15T00:00:00Z",
"EndDate": "2025-06-30T00:00:00Z",
"Priority": 2
}
Update a project
PATCH /odata/Project('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')
Content-Type: application/json
{
"Name": "Updated Project Name",
}
Use $top and $skip for paginating large result sets:
GET /odata/Project?$top=50&$skip=100&$orderby=Name