Skip to content

Connect Power BI or Excel to the OData feed

All plans Any member

If your PMO has Power BI dashboards or Excel workbooks that read Project Online’s /ProjectData feed, that feed returns 410 Gone once Project Online retires on 30 September 2026. Onplana serves a read-only OData v4 feed at /api/odata with the same entity sets and the same column names, so an existing dashboard is re-pointed rather than rebuilt.

The credential is a personal access token with the Reporting feed (OData) scope. Nothing else is granted: a reporting token cannot change a task, list members, or connect an agent.

  1. Open Settings, then Developer, then API tokens.

  2. Choose New token, name it for the dashboard that will use it, and tick Reporting feed (OData) only.

  3. Copy the token once. It is shown a single time. If it is lost, revoke it here and create another.

  1. Download the starter connection file onplana-projectdata.pbids and open it in Power BI Desktop, or choose Get Data, then OData feed, and enter https://api.onplana.com/api/odata.

  2. When Power BI asks how to sign in, pick Basic. Enter anything as the user name and paste the token as the password. Set the level to the feed URL so the credential applies to every entity set.

  3. Pick the entity sets you need. Most Project Online reports use Projects, Tasks, Assignments and Resources; timesheet reports add TimesheetLines.

  4. Load. Relationships join on the same keys as before: Tasks.ProjectId to Projects.ProjectId, Assignments.TaskId to Tasks.TaskId, and Assignments.ResourceId to Resources.ResourceId.

For a scheduled refresh in the Power BI service, add the feed as a data source with Basic authentication and the same token as the password.

Choose Data, then Get Data, then From Other Sources, then From OData Feed. Enter the feed URL, choose Basic, and paste the token as the password.

Entity setWhat it isKey
ProjectsOne row per project, with owner, dates, progress, budget and currencyProjectId
TasksOne row per task, with dates, work, percent complete, costs and the parent taskTaskId
AssignmentsOne row per assigned task: the resource, the work and the actual hours loggedAssignmentId
ResourcesOrganization membersResourceId
TimesheetLinesOne row per timesheet entry, with the day, hours, status and whether the project is billableTimesheetLineId
CustomFieldValuesOne row per custom field value on a project or taskCustomFieldValueId
TaskBaselinesOne row per task per saved baseline, with the baselined dates, work and costTaskBaselineId

Columns follow the ProjectData prefixes: ProjectName, ProjectStartDate, TaskFinishDate, TaskPercentCompleted, ResourceName, TimeByDay, ActualWork. TaskPriority uses Project Online’s 0 to 1000 scale, with 500 as medium. The full list, with types, is in the feed’s $metadata document.

The feed is server-paged. A page holds up to 500 rows by default and 1,000 at most; a full page carries @odata.nextLink, and Power BI follows it automatically. Ask for a total with $count=true.

$filter accepts one clause of the form Property eq 'value' on the key-like columns of each set, for example /api/odata/Tasks?$filter=ProjectId eq 'cm...'. Anything the feed cannot honour, such as $expand or $apply, is refused with a clear error rather than quietly returning more rows than you asked for.

  • Export compliance evidence uses the same token mechanism with the auditor scope.
  • The migration checklist item OData feeds and downstream consumers in the Project Online estate assessment now points here.