Skip to main content

Custom Fields

Custom fields allow you to extend the InLoox data models with your own attributes. Through the API, you can manage field definitions, read and update values, and control access permissions.

Dynamic Endpoints

To retrieve custom fields together with the standard properties of an entity, use the Dynamic* endpoints (e.g., DynamicProject, DynamicTaskItem, DynamicContact). These return all configured custom fields as additional columns.

To access custom fields, use the Dynamic variants of the entities:

Standard EntityDynamic VariantDescription
ProjectDynamicProjectProjects with custom fields
TaskDynamicTaskItemTasks with custom fields
TimeEntryDynamicTimeEntryTime entries with custom fields
BudgetDynamicBudgetBudgets with custom fields
LineItemDynamicLineItemLine items with custom fields
n/aDynamicContactContacts with custom fields

CustomField

The CustomField entity provides direct access to individual custom field values. Each value is identified by the field name (Name) and the object ID (ObjectId).

Composite Key

CustomField uses a composite key consisting of Name and ObjectId. Two URL notations are supported for accessing individual values: bracket notation and slash notation. Both behave identically.

Data Model

PropertyTypeDescription
ObjectIdguidID of the object the field is assigned to (e.g., ProjectId, TaskItemId).
NamestringInternal column name of the custom field, e.g., "cf_f52d9d79_Location". See in InLoox under Account Settings > Custom Fields.
ValuestringThe value of the custom field.
TypestringThe data type of the field: String, DateTime, Integer, Decimal, Boolean, List, Currency.

Endpoints

Retrieve a value (bracket notation)

Retrieve a custom field value

GET/odata/CustomField(Name={keyName},ObjectId={keyObjectId})
ParameterTypeRequiredDescription
keyNamestringThe internal column name of the field.
keyObjectIdguidThe ID of the associated object.

Update a value (bracket notation)

Update a custom field value

PATCH/odata/CustomField(Name={keyName},ObjectId={keyObjectId})
ParameterTypeRequiredDescription
keyNamestringThe internal column name of the field.
keyObjectIdguidThe ID of the associated object.
BodyobjectJSON object with the following fields:

Value (string, required) — The new value of the custom field.

Retrieve a value (slash notation)

Retrieve a custom field value using slash notation

GET/odata/CustomField/Name={keyName},ObjectId={keyObjectId}
ParameterTypeRequiredDescription
keyNamestringThe internal column name of the field.
keyObjectIdguidThe ID of the associated object.

Update a value (slash notation)

Update a custom field value using slash notation

PATCH/odata/CustomField/Name={keyName},ObjectId={keyObjectId}
ParameterTypeRequiredDescription
keyNamestringThe internal column name of the field.
keyObjectIdguidThe ID of the associated object.
BodyobjectJSON object with the following fields:

Value (string, required) — The new value of the custom field.

Batch update

Update multiple custom field values at once

POSTodata/CustomField/BatchUpdate
ParameterTypeRequiredDescription
BodyarrayJSON array of objects with the following fields per entry:

ObjectId (guid, required) — The ID of the entity (e.g., project or task ID).
Name (string, required) — The internal column name of the custom field.
Value (string?, optional) — The value to set. Pass null to clear the field.

Allows updating multiple custom fields in a single call.

Batch Update

Use BatchUpdate when you want to set multiple custom fields for an object at the same time. This is more efficient than multiple individual PATCH calls.


CustomFieldDefinition

The CustomFieldDefinition entity describes the metadata of a custom field, including data type, display name, and validation rules.

Data Model

PropertyTypeDescription
CustomFieldDefinitionIdguidUnique ID of the field definition.
ColumnNamestringInternal column name (unique identifier).
DisplayNamestringDisplay name of the field in the user interface.
TableNamestringTable the field is assigned to. Values: TimeEntry (0), LineItem (1), Budget (2), Document (3), MindMapNode (4), MindMap (5), Planning (6), TaskItem (7), Project (8), CheckList (9), FiscalPeriodFunding (10), Risk (11), Contact (12), PresetLineItem (101), Preset (102).
OrdinalPositionint?Sort position of the field.
StringValuestringDefault value (string).
IntValueint?Default value (integer).
BoolValueboolDefault value (boolean).
WriteProtectionEnabledboolWhether write protection is enabled.
DecimalValuedecimal?Default value (decimal).
DateTimeValueDateTimeOffset?Default value (date/time).
ColumnTypeintData type of the column. Values: 0 = String (text), 1 = DateTime (date and time), 2 = Integer (whole number), 3 = Decimal (decimal number), 4 = Boolean (yes/no value), 5 = List, 6 = Currency.
DisplayRuleFieldstringField name for conditional display.
DisplayRuleExpressionstringExpression for conditional display.
CurrencySymbolstringCurrency symbol (for currency fields).
WarningIfEmptyboolShow a warning if the field is empty.
AllowAddNewItemboolWhether users may add new values to the dropdown list.
DefaultCustomFieldDefinitionListIdguid?ID of the default dropdown list.
DefaultCustomFieldDefinitionListValuestringDefault value from the dropdown list.
CustomFieldSectionIdguidID of the section this field belongs to. See CustomFieldSection.

Endpoints

Retrieve all field definitions for the entire account

GET/odata/CustomFieldDefinition

Supports OData query options.


Retrieve a field definition by ID

GET/odata/CustomFieldDefinition({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldDefinitionId.

Create a new field definition

POST/odata/CustomFieldDefinition
ParameterTypeRequiredDescription
BodyDelta<ApiCustomFieldDefinition>JSON object with the entity properties.
info

The ColumnName must be unique per table. Use a prefix like cf_ to easily distinguish custom fields from system fields.


Update a field definition

PATCH/odata/CustomFieldDefinition({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldDefinitionId.
BodyDelta<ApiCustomFieldDefinition>JSON object with the fields to update.

Delete a field definition

DELETE/odata/CustomFieldDefinition({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldDefinitionId.
warning

Deleting a field definition also removes all associated values from all objects. This action cannot be undone.

Returns 204 No Content on success.


CustomFieldPermission

The CustomFieldPermission entity controls access to custom fields. You can specify which users or roles are allowed to edit which fields.

Data Model

PropertyTypeDescription
CustomFieldPermissionIdguidUnique ID of the permission.
CustomFieldDefinitionIdguidID of the associated field definition.
SubjectTypeintType of permission. Values: 1 = User, 2 = Role.
SubjectIdguidID of the subject (user ID or role ID).
RoleTypeint?Role (optional, for role-based permissions). 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.

Endpoints

Retrieve all field permissions for all fields

GET/odata/CustomFieldPermission

Supports OData query options.


Retrieve a field permission by ID

GET/odata/CustomFieldPermission({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldPermissionId.

Create a new field permission

POST/odata/CustomFieldPermission
ParameterTypeRequiredDescription
BodyDelta<ApiCustomFieldPermission>JSON object with the permission properties.

Update a field permission

PATCH/odata/CustomFieldPermission({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldPermissionId.
BodyDelta<ApiCustomFieldPermission>JSON object with the fields to update.

Delete a field permission

DELETE/odata/CustomFieldPermission({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldPermissionId.
warning

Deleting a permission makes the custom field writable for all users who have write access to the corresponding entity.

Returns 204 No Content on success.


Retrieve blocked fields of an entity for the current user

GET/odata/CustomFieldPermission/GetBlockedFieldsForEntity(entityType={entityType},entityId={entityId})
ParameterTypeRequiredDescription
entityTypestringThe entity type. Values: TimeEntry (0), LineItem (1), Budget (2), Document (3), MindMapNode (4), MindMap (5), Planning (6), TaskItem (7), Project (8), CheckList (9), FiscalPeriodFunding (10), Risk (11), Contact (12), PresetLineItem (101), Preset (102).
entityIdguidThe ID of the specific entity.

Returns a list of custom fields that the current user is not allowed to edit.


CustomFieldSection

The CustomFieldSection entity allows you to organize custom field definitions into named groups within each entity type. Each section has a display name and a sort position.

Data Model

PropertyTypeDescription
CustomFieldSectionIdguidUnique ID of the section.
TableNamestringEntity type the section belongs to. Values: TimeEntry (0), LineItem (1), Budget (2), Document (3), MindMapNode (4), MindMap (5), Planning (6), TaskItem (7), Project (8), CheckList (9), FiscalPeriodFunding (10), Risk (11), Contact (12), PresetLineItem (101), Preset (102).
DisplayNamestringDisplay name of the section in the user interface.
OrdinalPositionintSort position of the section within its entity type.

Endpoints

Retrieve all custom field sections

GET/odata/CustomFieldSection

Supports OData query options.


Retrieve a section by ID

GET/odata/CustomFieldSection({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldSectionId.

Create a new section

POST/odata/CustomFieldSection
ParameterTypeRequiredDescription
BodyobjectJSON object with the following fields:

TableName (string, required) — The entity type for the section.
DisplayName (string, required) — The display name of the section.

Update a section

PATCH/odata/CustomFieldSection({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldSectionId.
BodyobjectJSON object with the fields to update:

DisplayName (string, optional) — The new display name.
OrdinalPosition (int, optional) — The new sort position.

Delete a section

DELETE/odata/CustomFieldSection({key})
ParameterTypeRequiredDescription
keyguidThe CustomFieldSectionId.
targetSectionIdguidThe ID of the section to move existing fields to before deleting.
warning

Deleting a section moves all its custom fields to the target section. There must be at least one other section for the same entity type.

Returns 204 No Content on success.


Dynamic Endpoints

Dynamic endpoints provide custom field values together with the standard properties of the entity in a single flat result set. Instead of querying CustomField separately and joining via ObjectId, you can read and filter custom field data directly on the entity.

Available Dynamic Entity Sets

Dynamic EndpointBase Entity
/odata/DynamicProjectProject
/odata/DynamicTaskItemTaskItem
/odata/DynamicBudgetBudget
/odata/DynamicLineItemLineItem
/odata/DynamicTimeEntryTimeEntry
/odata/DynamicContactContact (see Contacts)

Retrieve projects with included custom field columns

GET/odata/DynamicProject

Retrieve task items with included custom field columns

GET/odata/DynamicTaskItem

Retrieve budgets with included custom field columns

GET/odata/DynamicBudget

Retrieve line items with included custom field columns

GET/odata/DynamicLineItem

Retrieve time entries with included custom field columns

GET/odata/DynamicTimeEntry

Custom Field Column Naming

Custom field columns appear with the prefix CustomField_, followed by the ColumnName of the corresponding CustomFieldDefinition. For example, a field with ColumnName = Priority appears as CustomField_Priority in the dynamic response.

These prefixed columns can be used in all standard OData query options:

Query OptionExample
$select$select=Name,CustomField_Priority
$filter$filter=CustomField_Priority eq 'High'
$orderby$orderby=CustomField_Priority asc
tip

Dynamic endpoints are read-only views. To update custom field values, use the CustomField PATCH or BatchUpdate endpoints described above.


OData Query Examples

Retrieve a custom field value

GET /odata/CustomField(Name='cf_Priority',ObjectId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Update a custom field value

PATCH /odata/CustomField(Name='cf_Priority',ObjectId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)
Content-Type: application/json

{
"Value": "High"
}

Update multiple custom field values at once

POST /CustomField/BatchUpdate
Content-Type: application/json

[
{ "Name": "cf_Priority", "ObjectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Value": "High" },
{ "Name": "cf_Region", "ObjectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "Value": "EMEA" }
]

Retrieve definitions for a specific table

GET /odata/CustomFieldDefinition?$filter=TableName eq 'Project'&$orderby=OrdinalPosition

Create a field definition

POST /odata/CustomFieldDefinition
Content-Type: application/json

{
"ColumnName": "cf_RiskLevel",
"DisplayName": "Risk Level",
"TableName": "Project",
"ColumnType": 0,
"OrdinalPosition": 5,
"WarningIfEmpty": false,
"WriteProtectionEnabled": false
}

Update a field definition

PATCH /odata/CustomFieldDefinition('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')
Content-Type: application/json

{
"DisplayName": "Risk Assessment",
"WarningIfEmpty": true
}

Filter permissions by field definition

GET /odata/CustomFieldPermission?$filter=CustomFieldDefinitionId eq xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Create a field permission

POST /odata/CustomFieldPermission
Content-Type: application/json

{
"CustomFieldDefinitionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"SubjectType": 0,
"SubjectId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

Update a field permission

PATCH /odata/CustomFieldPermission('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')
Content-Type: application/json

{
"RoleType": 1
}

Retrieve blocked fields for an entity

GET /odata/CustomFieldPermission/GetBlockedFieldsForEntity(entityType='Project',entityId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

Filter projects by custom field

GET /odata/DynamicProject?$filter=CustomField_Priority eq 'High'

Select and filter projects with custom fields

GET /odata/DynamicProject?$select=ProjectId,Name,CustomField_Priority,CustomField_Region&$filter=CustomField_Region eq 'EMEA'&$orderby=CustomField_Priority asc
tip

Combine $filter with $select to minimize response size. Use $top and $skip to paginate large result sets.