Project KPI Snapshots
The ProjectKpiSnapshot entity provides access to the daily KPI history for projects. InLoox records a nightly snapshot of all numeric and date KPIs for every active project, including custom fields.
Only days on which a value actually changed are stored. Each row stays valid from its EventDate until its ValidUntil date, which keeps the history compact — a project whose costs remain unchanged for three weeks produces one row, not 21. To obtain a value for every single day, use the GetSeries function, which expands the stored rows into a continuous daily series.
This endpoint requires the KPI Trends feature to be enabled for the account and the Read Historic Data user permission (enabled by default). Field-level security applies: financial values are only returned when the requesting user also has budget read rights on the respective project.
Data Model
| Property | Type | Description |
|---|---|---|
ProjectKpiSnapshotId | guid | Unique identifier of the snapshot row. |
ProjectId | guid | The project this snapshot belongs to. |
EventDate | date | The calendar date on which this KPI value was recorded. |
ValidUntil | date? | The last date for which this row is valid. Null means the row still reflects the current value. |
CreatedAt | datetime | Server timestamp when the row was written. |
The snapshot table also contains one column per tracked KPI. All KPI columns are dynamic and depend on the project configuration. Use the GetSeries function to retrieve KPI values in a structured time-series format.
Endpoints
List project KPI snapshots
/odata/ProjectKpiSnapshotReturns snapshot rows. Supports OData query options ($filter, $select, $orderby, $top, $skip).
Direct access to the snapshot table is useful for advanced reporting. For standard trend charts, prefer the GetSeries function described below.
Functions
Retrieve KPI trend series for one or more projects
/odata/ProjectKpiSnapshot/GetSeriesReturns daily KPI time series for up to 200 projects and up to 20 fields.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectIds | guid[] | ✅ | List of project IDs for which to retrieve trend series. Maximum 200 projects per request. |
fields | string[] | ✅ | List of KPI field names to retrieve (e.g. "TotalCostActual", "PercentComplete"). Maximum 20 fields per request. Unknown field names are silently skipped. |
from | date? | — | Start date (inclusive) for the time range. Defaults to 90 days before today if omitted. |
to | date? | — | End date (inclusive) for the time range. Defaults to today if omitted. |
The response returns one series entry per requested project and field combination, with daily data points covering the requested date range (gaps are forward-filled with the last known value).
OData Query Examples
GET /odata/ProjectKpiSnapshot/GetSeries?projectIds=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&fields=TotalCostActual,PercentComplete
GET /odata/ProjectKpiSnapshot/GetSeries?projectIds=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy&fields=TotalCostActual&from=2025-01-01&to=2025-12-31
GetSeries returns the same data that powers the sparkline columns in the project list and the trend widgets on the project dashboard. The fields parameter accepts the same column names that appear in the DynamicProject endpoint.