Get analytics rolled up for one client
Returns hours, amount, costs, expenses, invoice totals, planned-invoice totals, and a monthly histogram aggregated across every project belonging to the client, plus per-project, per-task, per-reference, per-user, and per-team breakdowns. Invoice and planned-invoice totals include an internal / external split keyed by isInternal; individual invoice records are not included (use the project-level endpoints for that). Restricted to admins (canManageAllProjects).
query Parameters
clientClient ID
Get analytics rolled up for one client › Responses
Client analytics
Project effort distribution broken down per period
Returns per-project rows of tracked hours, tracked amount, billed amount, billable hours, planned hours, and planned amount, sliced into monthly or weekly periods spanning [startDate, endDate]. Admins, users with canManageAllProjects, and PMs (canManageOwnProjects) / project members (canAccessOwnProjects) may call this endpoint; the latter only see projects they are assigned to.
Project effort distribution broken down per period › Request Body
startDateStart of the window (YYYY-MM-DD). Inclusive.
endDateEnd of the window (YYYY-MM-DD). Inclusive.
isWeekIntervalWhen true, the window is split into weekly periods. When false (default), monthly periods.
projectIdsRestrict the response to these project IDs. Omit to include every project the caller can read. Callers with limited project access have this list intersected with their accessible projects.
Project effort distribution broken down per period › Responses
Effort distribution per period
Project effort distribution for a year, broken down by month
Returns one entry per calendar month with per-project tracked duration, amount, billed amount, planned amount, planned-over-budget amount, and posted expenses. Requires canManageAllProjects, canAccessUsers, or admin.
path Parameters
yearCalendar year (2000–2050).
query Parameters
teamWhen set, scopes the response to a single team: tracked totals only include time entries booked by users while assigned to this team, the project list is filtered to projects with at least one non-guest member of the team, and planner figures (amountPlanned, amountPlannedOverBudget) are limited to this team's allocations.
Project effort distribution for a year, broken down by month › Responses
Effort distribution by month
List analytics across projects
Returns per-project roll-ups (hours, amount, costs, monthly histogram, invoices, planned invoices, planner data) for every project the caller can read. Invoice and planned-invoice payloads include an internal / external split keyed by isInternal. Filterable by project IDs and an optional date range. Requires canAccessOwnProjects, project-manager status on the targeted projects, or admin.
query Parameters
projectProject IDs to include. Omit to return every project the caller can read. Repeat the parameter for multiple IDs (e.g. ?project=1&project=2). If only a single project is specified, the return shape is altered, please see the related single project entry with /:id in the URL
start_dateStart of the date window for time-entry, expense, and invoice aggregation (YYYY-MM-DD). Has no effect unless end_date is also supplied.
end_dateEnd of the date window (YYYY-MM-DD). Pairs with start_date.
List analytics across projects › Responses
Multi-project analytics
Get analytics for a single project
Returns budgets, time entries, expenses, invoices, planned invoices, costs, and a monthly histogram for one project, plus breakdowns by user, task, reference, and team. Invoice and planned-invoice payloads include an internal / external split keyed by isInternal. The caller must be able to read the project (404 otherwise) and either manage all projects, be a project manager on it, or have canAccessOwnProjects (400 otherwise).
path Parameters
idProject ID
Get analytics for a single project › Responses
Project analytics
Get lightweight per-project analytics for non-PM users
Returns hours-only roll-up for one project, intended for users who can see the project but not full cost / amount data. The endpoint is gated by the account-level activateProjectAnalyticsForUser setting; the request returns 400 if it is disabled. Returns 404 if the project is not visible to the caller.
query Parameters
projectProject ID
Get lightweight per-project analytics for non-PM users › Responses
Project analytics for user
Get analytics rolled up for one super-project
Returns hours, amount, costs, expenses, invoice totals, planned-invoice totals, and a monthly histogram aggregated across every sub-project under the super-project, plus per-project, per-task, per-reference, per-user, and per-team breakdowns. Invoice and planned-invoice totals include an internal / external split keyed by isInternal; individual invoice records are not included (use the project-level endpoints for that). Restricted to admins (canManageAllProjects) or users who are project manager on every sub-project.
query Parameters
superProjectSuper-project (parent project) ID
Get analytics rolled up for one super-project › Responses
Super-project analytics
Aggregate time-entry totals over a date range
Returns hours, amount, costs, and a per-group breakdown of time entries within a date window, filterable by project, client, task, user, team, tag, invoice, reference, validation status, and billable / billed flags. The shape of groupedBy follows the groupBy query parameter.
query Parameters
start_dateStart of the date window (YYYY-MM-DD). Inclusive.
end_dateEnd of the date window (YYYY-MM-DD). Inclusive. Must be ≥ start_date.
projectFilter to these project IDs. Repeat the parameter for multiple IDs.
project.clientFilter to projects belonging to these client IDs. Ignored if project is also specified.
taskFilter to these task IDs.
userFilter to time entries owned by these user IDs.
teamFilter to time entries on these team IDs.
invoiceFilter to time entries attached to these invoice IDs.
referenceFilter to these reference IDs (v2 reference system).
timeEntryReferenceFilter to these legacy time-entry-reference IDs (v1 reference system).
tagAssignments.user.tagFilter to time entries owned by users assigned to these tag IDs.
tagAssignments.tagOlder alias for tagAssignments.user.tag. Both forms are accepted; if both are present tagAssignments.user.tag wins.
tagAssignments.project.tagFilter to time entries on projects assigned to these tag IDs.
billableFilter by billable flag.
billedFilter by whether the entry has been billed (billedAt is not null).
excludeInternalProjectsWhen true, excludes projects with no client. Has no effect if project or project.client is set.
excludeZeroBillableAmountWhen true, excludes entries whose rounded duration or hourly rate is zero. Forces billable=true if billable is otherwise unset.
validationStatusFilter by approval / validation status of the time entry.
groupByColumn to group groupedBy rows by. When omitted, rows are aggregated per project. The matching column is populated on each row.
invoiceTypetrue filters to entries attached to any invoice; false filters to entries with no invoice. Omit to include both.
comment.containsFull-text search over the time-entry comment field.
When set, the billed and billable filters are combined with OR instead of AND. Pass as bracket-style query params, e.g. or[0][billed]=true&or[1][billable]=true.
Aggregate time-entry totals over a date range › Responses
Time-entry analytics
Per-user tracked, planned, and expected hours bucketed by period
For every user the caller is allowed to see, returns tracked time, worktime, planner data, and expected hours rolled up into period buckets (day / week / monthweek / month / year). Useful for utilisation views, planned-vs-actual dashboards, and capacity reports. Requires canAccessUsers, or limitedTeamStaffAccess on at least one team — in the latter case the response is restricted to users assigned to those teams.
query Parameters
startDateStart of the window (YYYY-MM-DD). Inclusive.
endDateEnd of the window (YYYY-MM-DD). Inclusive. Must be ≥ startDate.
periodBucket size. monthweek splits each month into ISO weeks so a week never crosses a month boundary; week uses raw ISO weeks.
includeProjectsWhen true, each period bucket includes a projects map keyed by project ID with the same per-project metrics. Off by default to keep responses small.
Per-user tracked, planned, and expected hours bucketed by period › Responses
User analytics for period
Map keyed by user ID. Each value is itself a map keyed by period ID.
Aggregated staff costs (employees, freelancers, planned, expenses)
Returns staff-cost totals for a date window or for each month of a year. The response shape switches with aggregation_type (or with the /monthly/{year} route): aggregated returns combined current-vs-previous totals, employees and freelancers return per-user current totals plus a previous total, and the monthly route returns 12 monthly rows. Costs are computed from useremployment (monthly remuneration × employer contribution prorated by active days) and time-entry hours × hourly remuneration. Without user, requires canAccessProjectCosts or canAccessRemunerations. With user, requires canAccessRemunerations (and additionally canAccessAdminRemunerations to see costs of admin users).
path Parameters
aggregation_typeShape selector. aggregated returns one combined number per category; employees / freelancers return per-user breakdowns scoped to that employment-type group. Only present on the /costs/{aggregation_type} variant.
query Parameters
start_dateStart of the window (YYYY-MM-DD). Required for non-monthly variants.
end_dateEnd of the window (YYYY-MM-DD). Required for non-monthly variants.
prev_start_dateStart of the comparison window (YYYY-MM-DD). Required for non-monthly variants.
prev_end_dateEnd of the comparison window (YYYY-MM-DD). Required for non-monthly variants.
userRestrict the response to one user. Switches the permission requirement from canAccessProjectCosts to canAccessRemunerations (plus canAccessAdminRemunerations for admins).
teamRestrict cost calculation to users who are non-guest members of this team. Applies to both employment-derived costs and planner-derived figures.
Aggregated staff costs (employees, freelancers, planned, expenses) › Responses
User costs
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: current, previous | |
| type = object · requires: current, previous | |
| type = object · requires: year, monthlyCosts |
hourlyRateEffective hourly rate. Present only when the request is scoped to a single user via user.
Aggregated staff costs (employees, freelancers, planned, expenses)
Returns staff-cost totals for a date window or for each month of a year. The response shape switches with aggregation_type (or with the /monthly/{year} route): aggregated returns combined current-vs-previous totals, employees and freelancers return per-user current totals plus a previous total, and the monthly route returns 12 monthly rows. Costs are computed from useremployment (monthly remuneration × employer contribution prorated by active days) and time-entry hours × hourly remuneration. Without user, requires canAccessProjectCosts or canAccessRemunerations. With user, requires canAccessRemunerations (and additionally canAccessAdminRemunerations to see costs of admin users).
path Parameters
yearCalendar year (2000–2050). Only present on the /costs/monthly/{year} variant.
query Parameters
start_dateStart of the window (YYYY-MM-DD). Required for non-monthly variants.
end_dateEnd of the window (YYYY-MM-DD). Required for non-monthly variants.
prev_start_dateStart of the comparison window (YYYY-MM-DD). Required for non-monthly variants.
prev_end_dateEnd of the comparison window (YYYY-MM-DD). Required for non-monthly variants.
userRestrict the response to one user. Switches the permission requirement from canAccessProjectCosts to canAccessRemunerations (plus canAccessAdminRemunerations for admins).
teamRestrict cost calculation to users who are non-guest members of this team. Applies to both employment-derived costs and planner-derived figures.
Aggregated staff costs (employees, freelancers, planned, expenses) › Responses
User costs
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: current, previous | |
| type = object · requires: current, previous | |
| type = object · requires: year, monthlyCosts |
hourlyRateEffective hourly rate. Present only when the request is scoped to a single user via user.
Per-user billable revenue, with optional yearly breakdown
Returns billable revenue derived from time-entry duration × hourly rate, split by month. With the /monthly/{year} route, the response is normalised to a 12-entry array for the given year. Without the path year, the raw rows from the underlying query (or monthlyuserrevenue cache) are returned. The endpoint distinguishes total revenue from in-budget revenue, so callers can see how much was logged after a project hit its budget. Restricted to admins, users with canManageAllProjects, or PMs who have limitedTeamStaffAccess on the team the queried user belongs to.
query Parameters
userRestrict the response to one user. Without it the response includes a row per user × month.
Per-user billable revenue, with optional yearly breakdown › Responses
User revenue
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = array | |
| type = array |
Always 12 entries, one per month, in order. Months with no billable activity have all amounts set to 0.
monthMonth number, 1–12.
amountBillable revenue for the month, excluding the portion of time entries booked after the project went over budget.
totalAmountBillable revenue including amounts booked after going over budget.
amountOutOfBudgetPortion of totalAmount that was logged after the project exceeded its budget. Equal to totalAmount - amount.
Per-user billable revenue, with optional yearly breakdown
Returns billable revenue derived from time-entry duration × hourly rate, split by month. With the /monthly/{year} route, the response is normalised to a 12-entry array for the given year. Without the path year, the raw rows from the underlying query (or monthlyuserrevenue cache) are returned. The endpoint distinguishes total revenue from in-budget revenue, so callers can see how much was logged after a project hit its budget. Restricted to admins, users with canManageAllProjects, or PMs who have limitedTeamStaffAccess on the team the queried user belongs to.
path Parameters
yearCalendar year (2000–2050). Only present on the /monthly/{year} variant.
query Parameters
userRestrict the response to one user. Without it the response includes a row per user × month.
Per-user billable revenue, with optional yearly breakdown › Responses
User revenue
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = array | |
| type = array |
Always 12 entries, one per month, in order. Months with no billable activity have all amounts set to 0.
monthMonth number, 1–12.
amountBillable revenue for the month, excluding the portion of time entries booked after the project went over budget.
totalAmountBillable revenue including amounts booked after going over budget.
amountOutOfBudgetPortion of totalAmount that was logged after the project exceeded its budget. Equal to totalAmount - amount.