Changelog

Last changes in FlexiProject API.

2026.09

Personal Tokens

Personal tokens are a new way of authenticating integrations. Instead of storing a user's password, an integration stores a personal token and exchanges it for a short-lived access token whenever it needs one. Authenticating with account credentials remains valid, but is now deprecated, thus switching to personal tokens is recommended.

A personal token is generated in the application, in your user profile.

To obtain an access token, send the personal token together with the e-mail address of the user it was issued to:

                POST /api/user/token/personal

{
  "email": "user@example.com",
  "token": "{{personalToken}}"
}
            

The response returns accessToken, tokenType, selectedTenantId and expires. The access token is valid for one hour and is scoped to the tenant the personal token belongs to. Send it in the Authorization header using the Bearer scheme, exactly like the access token returned by /api/user/token.

Repeat the exchange once the access token expires. The personal token itself does not have to be renewed. Treat it like a password – anyone holding it can obtain access tokens with the permissions of the user it was issued to.

Budget Redesign

The budget model has been redesigned. A budget item is no longer a single amount tied to a single date. It is now a container that groups forecasts and actuals.

The following properties have been removed from budget item DTOs:

  • date
  • baselineDate
  • dateType
  • daysDiff
  • isCompleted

The following properties have been added in their place:

  • forecastAmount – sum of the item's forecasts
  • actualAmount – sum of the actuals assigned to the item
  • dates – the item's date range, derived from its forecasts and actuals
  • scheduleDateLink – the item's link to a schedule item date
  • backgroundColor

Because amounts and dates are now held by forecasts and actuals, the dedicated setters for these properties have been decommissioned:

  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/amount
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/date
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/isCompleted
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/amount
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/day

Forecasts are managed through the following endpoints:

  • GET /api/projects/{{projectId}}/budget/forecasts
  • GET /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/forecasts
  • POST /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/forecasts
  • DELETE /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/forecasts/{{forecastId}}
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/forecasts/{{forecastId}}/amount
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/forecasts/{{forecastId}}/date
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/forecasts/{{forecastId}}/schedule
  • POST /api/projects/{{projectId}}/budget/forecasts/batch/remove
  • POST /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/date/shift

A forecast may be pinned to a schedule item date instead of a fixed calendar date. Send null to the schedule endpoint to unpin it. Setting a link recalculates the forecast date; updating the date of a pinned forecast re-measures its offset from the new date. The link has the following shape:

                "scheduleDateLink": {
  "dateType": 0,
  "day": {
    "day": 0,
    "unit": 1
  }
}
            

Equivalent endpoints are available for project templates under /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{budgetItemId}}/forecasts, including GET of a single forecast template by its id and a template-wide GET /api/projectTemplates/{{projectTemplateId}}/budget/forecasts.

The schedule link endpoints keep their addresses but now accept a new request body:

  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/schedule
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/schedule

Budget Actuals

Recorded spend is now a first-class entity. An actual may be assigned to a budget item or left unassigned, and carries its own attachments and field values.

  • GET /api/projects/{{projectId}}/budget/actuals
  • POST /api/projects/{{projectId}}/budget/actuals
  • PUT /api/projects/{{projectId}}/budget/actuals/{{actualId}}
  • DELETE /api/projects/{{projectId}}/budget/actuals/{{actualId}}

To register an actual, send the amount together with the budget item it belongs to:

                POST /api/projects/{{projectId}}/budget/actuals

{
  "budgetItemId": "{{budgetItemId}}",
  "type": 0,
  "date": "2026-09-30",
  "amount": 12500.00
}
            

Set budgetItemId to null to register the actual without assigning it to a budget item. The type property follows the budget item type used elsewhere in the Budget API. The created actual is returned in the response body with its id.

Actuals follow the same custom fields model introduced for budget items in 2026.05. Available field definitions are returned by a new endpoint, and values are set per field:

  • GET /api/actualFields
  • PUT /api/projects/{{projectId}}/budget/actuals/{{actualId}}/fieldValue/{{fieldId}}

The field value endpoint accepts the same request body as the budget field value endpoint:

                {
  "value": "expectedValue"
}
            

Workspace Permissions

Workspaces, introduced in 2026.01, now carry their own permission set. Permissions for projects, project templates, acceptance path templates, project fields and project charters are granted per workspace rather than globally.

Permissions can be read and granted for a user group and for an organization user:

  • GET /api/UserGroup/{{id}}/workspaces
  • PUT /api/UserGroup/{{id}}/workspaces/{{workspaceId}}
  • GET /api/UserManagement/{{userId}}/workspaces
  • PUT /api/UserManagement/{{userId}}/workspaces/{{workspaceId}}

Both update endpoints take the same request body. The call creates the permission set for the given workspace if it does not exist yet, and replaces it if it does:

                PUT /api/UserGroup/{{id}}/workspaces/{{workspaceId}}

{
  "permissions": {
    "Project": 15,
    "ProjectTemplate": 1,
    "AcceptancePathTemplate": 1,
    "ProjectFields": 0,
    "ProjectCharter": 3
  }
}
            

Each value is a set of permission flags combined into a single integer, where 0 grants no access and 15 grants every flag. Omitted areas are left without access. Send null as permissions to revoke the group's access to the workspace entirely.

The effective permissions of the calling user, merged across every group they belong to, are returned by:

  • GET /api/user/me/WorkspacePermission

The previous endpoint for assigning workspaces to a user has been decommissioned:

  • POST /api/UserManagement/{{userId}}/workspaces

Because these areas moved to the workspace scope, the request body of POST /api/UserGroup/{{id}}/GlobalPermission no longer accepts the following keys. Sending them has no effect:

  • Project
  • AcceptancePathTemplate
  • ProjectCharter

Custom field definitions are now workspace-aware as well and expose a workspaceIds property.

Risk and Product Template Attributes

Risk templates and product templates now follow the same per-attribute update pattern already used for risks and products on projects. The single update endpoints have been decommissioned:

  • PUT /api/projectTemplates/{{projectTemplateId}}/riskTemplates/{{riskTemplateId}}
  • PUT /api/projectTemplates/{{projectTemplateId}}/productTemplates/{{productTemplateId}}

For risk templates, use the dedicated endpoints under /api/projectTemplates/{{projectTemplateId}}/riskTemplates/{{riskTemplateId}}:

  • PUT .../name
  • PUT .../description
  • PUT .../ownerId
  • PUT .../categoryId
  • PUT .../impactId
  • PUT .../probabilityId
  • PUT .../itemTemplateId
  • PUT .../budgetImpactAmount
  • PUT .../budgetImpactDescription
  • PUT .../scheduleImpactDays
  • PUT .../scheduleImpactDescription
  • PUT .../finalProjectImpactDescription

For product templates, use the dedicated endpoints under /api/projectTemplates/{{projectTemplateId}}/productTemplates/{{productTemplateId}}:

  • PUT .../name
  • PUT .../description
  • PUT .../ownerId
  • PUT .../endDay
  • PUT .../itemTemplateId

Project List Endpoints

The endpoints returning every project in the organization have been decommissioned:

  • GET /api/project
  • GET /api/portfolio/projects
  • GET /api/reviews/projects

Projects are now read through their owning context. The following endpoints are unchanged and remain available:

  • GET /api/portfolio/{{portfolioId}}/projects
  • GET /api/reviews/{{id}}/projects
  • GET /api/user/me/projects

Condition History Endpoints

Organization condition history is served from a single address. The following endpoints have been decommissioned:

  • GET /api/portfolio/organizationConditionHistory
  • GET /api/project/{{projectId}}/organizationConditionHistory

Use the following instead:

  • GET /api/projectConditions/organizationConditionHistory

Miscellaneous changes

The following API's have been added:

  • Set background color of a budget item and of a budget template item
  • Set background color for multiple schedule items in one request

The following response models have been extended:

  • Project read models return createdAt
  • Project schedule returns allocation, workTime and fieldValues
  • Schedule relation updates accept predecessorId and successorId

2026.05

Required Header for All API Requests

Starting from this release, every API request must include the following header:

                Flexi-Project-Environment: flexi-project-prod
            

Requests missing this header will be rejected. For demo environments use flexi-project-demo value. Please update all your integrations accordingly.

Legacy URI's decommisioned

For SaaS environments old uri's have been decommisioned. If your integration involves different uri than shown below please update it.

                https://api.flexi-project.com/api
            

Budget Custom Fields

Budget items now use a unified custom fields model. Dedicated endpoints for individual budget properties have been replaced by a generic field value endpoint.

The following endpoints have been decommissioned:

  • POST /api/ExpenseType
  • GET /api/ExpenseType/{{id}}
  • PUT /api/ExpenseType/{{id}}
  • DELETE /api/ExpenseType/{{id}}
  • GET /api/organizationalCells
  • POST /api/organizationalCells
  • GET /api/organizationalCells/{{id}}
  • PUT /api/organizationalCells/{{id}}
  • DELETE /api/organizationalCells/{{id}}
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/capexOpex
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/documentNumber
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/organizationalCellId
  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/supplier
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/capexOpex
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/documentNumber
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/organizationalCellId
  • PUT /api/projectTemplates/{{projectTemplateId}}/budgetItems/{{itemTemplateId}}/supplier

A new endpoint for retrieving all available budget fields has been introduced:

  • GET /api/budgetFields

To update a budget item field value on a project or project template, use the following endpoints respectively:

  • PUT /api/projects/{{projectId}}/budgetItems/{{budgetItemId}}/fieldValue/{{fieldId}}
  • PUT /api/projectTemplates/{{templateId}}/budgetItems/{{budgetItemId}}/fieldValue/{{fieldId}}

Both endpoints accept the following request body:

                {
  "value": "expectedValue"
}
            

Standardization of Project and Schedule Attributes

Project attributes and schedule item attributes now share a unified field model. As a result:

  • The customColumnValues property in schedule item DTOs has been renamed to fieldValues.
  • The endpoint PUT /api/project/{{projectId}}/number has been removed. To update the project number, use:
                PUT /api/project/{{projectId}}/fieldValues/{{fieldId}}
            

Pass the fieldId corresponding to the migrated project number field. You can obtain this identifier from the project field definitions.

Allocation Adjustments

Allocation endpoints have been further refined. The following read endpoints have been removed:

  • GET /api/projects/{{projectId}}/scheduleItems/{{taskId}}/departmentAllocations
  • GET /api/projects/{{projectId}}/scheduleItems/{{taskId}}/ownerAllocations

Allocation updates now use day-range based endpoints. The single-day owner allocation endpoint has been replaced:

  • Removed: PUT /api/projects/{{projectId}}/scheduleItems/{{scheduleItemId}}/owners/{{ownerId}}/dayAllocations
  • Added: PUT /api/projects/{{projectId}}/scheduleItems/{{scheduleItemId}}/owners/{{ownerId}}/dayRangeAllocations

Department allocation updates are now also supported:

  • PUT /api/projects/{{projectId}}/scheduleItems/{{scheduleItemId}}/departments/{{departmentId}}/dayRangeAllocations

Resource Capacity Exceptions

In addition to default weekly resource capacity, new default capacity exceptions has been introduced, allowing fine-grained overrides per resource:

  • GET /api/Resources/{{resourceId}}/capacityException
  • PUT /api/Resources/{{resourceId}}/capacityExceptions

From now on the latter endpoint of the above includes editing default capacity, therefore the following method was removed:

  • PUT /api/Resources/{{resourceId}}/defaultCapacity

2026.01

Enhanced Resource Management

The Resources API has been expanded to include departments and now supports optimized reporting views. These updates provide a more comprehensive and structured approach to resource distribution and reporting.

The following legacy endpoints have been decommissioned:

  • GET /api/Resources/{{userId}}/projects
  • GET /api/Resources/{{userId}}/capacity
  • GET /api/Resources/{{userId}}/allocation

Introduction of Workspaces

To enhance data security, we have introduced Workspaces. System now ensures that users are restricted to specific, authorized environments.

Due to that, the following entities must now be assigned to at least one workspace:

  • Projects
  • Project Templates
  • Acceptance Path Templates
  • Charter Templates

When performing creation requests for these elements, you must include the workspaceIds property in the request body.

                "workspaceIds": ["{{workspaceId}}"]
            

Departments

The application now supports managing organizational structures. This update allows for the definition of departments, including the assignment of designated managers and associated team members.

Additionally departments are now fully integrated into task management and resource planning.

Formula in project attributes

Project attributes now have a Formula type, enabling the dynamic calculation of values. This feature allows attribute values to be calculated automatically based on the real-time state of other project properties.

Miscellaneous changes

The following API's has been added:

  • Import budgetlines to an existing project
  • Change task template row colors in project template
  • Change task template' type
  • Clone task template' with subtasks