Skip to main content

Reports

POST Generate flexible query report​

https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query

Executes a flexible query against the analytics database and returns formatted results.

curl -X POST https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query \
-H "Content-Type: application/json" \
-d '\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"chart_key":"string","conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"shared_report_id":"integer","transformations":[\{"name":"string","parameters":[\{\}]\}],"view_in_my_timezone":"boolean"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
response_formatstringfalseresponse data format
include_dictsbooleanfalseinclude dictionary data in response

Body​

NameTypeDescription
aggregation_filtersArray of object-
aggregationsArray of object-
attributesArray of object-
chart_keystringChartKey selects which of the shared report's stored chart queries to run. Required whenever SharedReportID is present, and meaningless without it.
conversion_dateobjectConversionDate is the profitability report's optional "as of" date: every converted value is looked up at this one date instead of each row's own business/fee date. Optional — omitted means each row uses its own date. Applies to actuals and fixed fees; the forecast always converts at today. A date past our latest published rate falls back to that latest rate (no error). Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost).
currencystringCurrency is the profitability report's FX-conversion target (ISO 4217). Optional: when omitted, the converted properties target the workspace's configured currency. Malformed input is a 400. Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost).
filtersArray of object-
groupingsArray of object-
limitinteger-
modifiersobject-
ordinationsArray of object-
paginationobject-
periodobject-
shared_report_idintegerSharedReportID names a shared report to read instead of running this request. Its presence changes what the whole body means: the report runs the owner's stored query as the owner, and every other field here — fragments, period, pagination — is discarded. Absent, the request is served by value exactly as it always was.
transformationsArray of object-
view_in_my_timezonebooleanViewInMyTimezone converts every local time in the report into the requesting user's own timezone instead of the one each entry was tracked in. The timezone itself is never taken from the payload: the API resolves it from the requester's account preference. Restricted to requesters who read other members' time.
aggregation_filters​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregation​
NameTypeDescription
functionstring-
propertystring-
conditions​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregation​
NameTypeDescription
functionstring-
propertystring-
conditions​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregation​
NameTypeDescription
functionstring-
propertystring-
conditions​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregations​
NameTypeDescription
functionstring-
propertystring-
attributes​
NameTypeDescription
propertystring-
conversion_date​
filters​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
groupings​
NameTypeDescription
propertystring-
show_emptyboolean-
modifiers​
ordinations​
NameTypeDescription
directionstring-
nullsstring-
propertystring-
pagination​
NameTypeDescription
pageinteger-
per_pageinteger-
period​
NameTypeDescription
fromstring-
presetstring-
tostring-
transformations​
NameTypeDescription
namestring-
parametersArray of Object-

Response​

200​

Report as JSON

NameTypeDescription
data_hierarchicalobject-
data_json_rowArray of object-
data_tableobject-
dictionariesobject-
total_countinteger-
data_hierarchical​
data_json_row​
dictionaries​
NameTypeDescription
clientsobject-
custom_field_optionsobject-
custom_fieldsobject-
groupsobject-
projectsobject-
statusobject-
tagsobject-
tasksobject-
user_tagsobject-
usersobject-
clients​
custom_field_options​
custom_fields​
groups​
projects​
status​
tags​
tasks​
user_tags​
users​

400​

Invalid request parameters

401​

Unauthorized

402​

Report view quota exceeded

403​

Forbidden — the plan lacks the report export entitlement

404​

Shared report or chart not found

422​

Currency conversion requested but an FX rate is missing for the period, or the shared report chart cannot be served through a share -- nothing left to render once its member custom fields are removed, or a shape the requested response format cannot render (shared_chart_restricted)

500​

Internal server error

POST Generate dictionary from filters​

https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary

Generates a dictionary containing task, project, client, and status information based on the provided filters. Two body shapes are accepted. The legacy shape is a bare JSON array of filter criteria (dto.FilterRequest), which remains the way to call this endpoint by value. The object shape documented below reads a shared report instead: it requires shared_report_id and chart_key, the stored query's filters replace any filters sent with it, and the dictionary resolves through the share owner's entity access. An object body that names no shared_report_id is rejected as an invalid body.

curl -X POST https://focus.toggl.com/api/reports/workspaces/{workspace_id}/query/dictionary \
-H "Content-Type: application/json" \
-d '[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}]' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-

Response​

200​

Successfully generated dictionary

NameTypeDescription
clientsobject-
custom_field_optionsobject-
custom_fieldsobject-
groupsobject-
projectsobject-
statusobject-
tagsobject-
tasksobject-
user_tagsobject-
usersobject-
clients​
custom_field_options​
custom_fields​
groups​
projects​
status​
tags​
tasks​
user_tags​
users​

400​

Invalid request parameters

401​

Unauthorized

403​

Forbidden

404​

Shared report or chart not found

500​

Internal server error

POST Generate workload report​

https://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload

Generates a workload report based on the given input. Breakdown reports (grouped by user_account_id) support optional pagination via 'page' and 'per_page', with a maximum per_page of 200. Paginated response includes 'total_count' with the total number of users matching the filters. An ordination on 'user_account_id' ('asc' or 'desc') orders breakdown members by display name across the whole result, not just the current page; it defaults to ascending. Ordinations on other properties are passed through to the reporting engine. Totals rows, trend buckets, and breakdown nodes include full-period working, baseline working, elapsed working, scheduled, scheduled draft, and scheduled remaining sums in minutes. The fields are 'sum_working_minutes', 'sum_baseline_working_minutes', 'sum_elapsed_working_minutes', 'sum_scheduled_minutes', 'sum_scheduled_draft_minutes', and 'sum_scheduled_remaining_minutes'. Working minutes exclude public holidays and deduct overlapping PTO. Elapsed working minutes include only dates through the requester's local today. Baseline working minutes are the same working minutes before those two deductions (public holidays and overlapping PTO added back), so 'sum_working_minutes' over 'sum_baseline_working_minutes' is the share of capacity that remains. It is never zeroed by the forecasting gate. Scheduled minutes cover non-draft task estimates, projected unmaterialized recurring periods, and planned calendar events. Scheduled draft minutes are gross task estimates from visible draft projects. Zero means none or not visible. A draft legacy calendar task can overlap with its still-planned calendar event, so the draft and scheduled sums are not strictly additive. Scheduled remaining minutes net each assignee's tracked time and roll unfinished estimates forward from the requester's local today. Past and overdue task slices are zero, while planned events count only from today. A breakdown period node shown as time off ('is_time_off' true) also names the dominant policy behind it: 'leave_type' (one of vacation, sick, parental, or other), 'policy_name', and 'emoji'. All three are added only for a caller who holds 'manage_time_off' on the organization, since the leave category is manager-only. When a period spans several policies, the one with the most minutes labels it. These three fields are omitted when the period carries no policy-backed leave, for example a holiday-only period. All three scheduled sums are zeroed unless the caller holds 'view_reports_forecasting', which is mapped to the Premium-only reports_forecasting feature. The response shape is unchanged, so a client without the entitlement degrades to logged-only rather than erroring. 'sum_working_minutes' is never zeroed — capacity is not a forecast.

curl -X POST https://focus.toggl.com/api/reports/workspaces/{workspace_id}/workload \
-H "Content-Type: application/json" \
-d '\{"aggregation_filters":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{"function":"string","property":"string"\},"conditions":[\{"aggregation":\{\},"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"aggregations":[\{"function":"string","property":"string"\}],"attributes":[\{"property":"string"\}],"chart_key":"string","conversion_date":\{\},"currency":"string","filters":[\{"conditions":[\{"conditions":[\{"conditions":[\{"conditions":[\{\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"operator":"string","property":"string","value":\{\}\}],"groupings":[\{"property":"string","show_empty":"boolean"\}],"limit":"integer","modifiers":\{\},"ordinations":[\{"direction":"string","nulls":"string","property":"string"\}],"pagination":\{"page":"integer","per_page":"integer"\},"period":\{"from":"string","preset":"string","to":"string"\},"shared_report_id":"integer","transformations":[\{"name":"string","parameters":[\{\}]\}],"view_in_my_timezone":"boolean"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
aggregation_filtersArray of object-
aggregationsArray of object-
attributesArray of object-
chart_keystringChartKey selects which of the shared report's stored chart queries to run. Required whenever SharedReportID is present, and meaningless without it.
conversion_dateobjectConversionDate is the profitability report's optional "as of" date: every converted value is looked up at this one date instead of each row's own business/fee date. Optional — omitted means each row uses its own date. Applies to actuals and fixed fees; the forecast always converts at today. A date past our latest published rate falls back to that latest rate (no error). Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost).
currencystringCurrency is the profitability report's FX-conversion target (ISO 4217). Optional: when omitted, the converted properties target the workspace's configured currency. Malformed input is a 400. Has no effect unless the request selects a converted property (converted_revenue / converted_labor_cost).
filtersArray of object-
groupingsArray of object-
limitinteger-
modifiersobject-
ordinationsArray of object-
paginationobject-
periodobject-
shared_report_idintegerSharedReportID names a shared report to read instead of running this request. Its presence changes what the whole body means: the report runs the owner's stored query as the owner, and every other field here — fragments, period, pagination — is discarded. Absent, the request is served by value exactly as it always was.
transformationsArray of object-
view_in_my_timezonebooleanViewInMyTimezone converts every local time in the report into the requesting user's own timezone instead of the one each entry was tracked in. The timezone itself is never taken from the payload: the API resolves it from the requester's account preference. Restricted to requesters who read other members' time.
aggregation_filters​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregation​
NameTypeDescription
functionstring-
propertystring-
conditions​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregation​
NameTypeDescription
functionstring-
propertystring-
conditions​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregation​
NameTypeDescription
functionstring-
propertystring-
conditions​
NameTypeDescription
aggregationobject-
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
aggregations​
NameTypeDescription
functionstring-
propertystring-
attributes​
NameTypeDescription
propertystring-
conversion_date​
filters​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
conditions​
NameTypeDescription
conditionsArray of object-
operatorstring-
propertystring-
valueobject-
groupings​
NameTypeDescription
propertystring-
show_emptyboolean-
modifiers​
ordinations​
NameTypeDescription
directionstring-
nullsstring-
propertystring-
pagination​
NameTypeDescription
pageinteger-
per_pageinteger-
period​
NameTypeDescription
fromstring-
presetstring-
tostring-
transformations​
NameTypeDescription
namestring-
parametersArray of Object-

Response​

200​

Successfully generated workload report

NameTypeDescription
data_hierarchicalobject-
data_json_rowArray of object-
data_tableobject-
dictionariesobject-
total_countinteger-
data_hierarchical​
data_json_row​
dictionaries​
NameTypeDescription
clientsobject-
custom_field_optionsobject-
custom_fieldsobject-
groupsobject-
projectsobject-
statusobject-
tagsobject-
tasksobject-
user_tagsobject-
usersobject-
clients​
custom_field_options​
custom_fields​
groups​
projects​
status​
tags​
tasks​
user_tags​
users​

400​

Invalid request parameters

403​

Insufficient permissions

404​

Shared report or chart not found

422​

Shared report chart cannot be served through a share -- nothing left to render once its member custom fields are removed, or a shape the requested response format cannot render (shared_chart_restricted)

500​

Internal server error

© 2026 Toggl. All rights reserved.