Skip to main content

Timesheets

GET List timesheets visible to the caller​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets

Returns the timesheets the caller may see whose period overlaps the required date_from/date_to window; a period is returned when it intersects the window at either edge, so the leading period is included even though it starts before date_from. The window may span at most 90 days (date_to no more than 90 days after date_from); a wider window is rejected with a 400 list_window_too_large error. Scope is every setup in the workspace for an admin with manage_timesheet_approvals; otherwise it is the setups the caller approves unioned with the setup they are enrolled in as a member. An explicit setup_id narrows to that one setup. Discontinued setups (end_date in the past) are excluded from this scope, but an explicit setup_id still resolves one, so retained history stays readable. Within a setup an admin or approver sees every member, a plain member only their own rows. Periods that have never been submitted are included as not-submitted rows; statuses narrows the result to the given approval states.

curl  https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
setup_idintegerfalsefilter to a single setup
user_account_ids[]integerfalsefilter to members, comma-separated or repeated
approver_user_account_ids[]integerfalsefilter to setups staffed by these approvers, comma-separated or repeated
team_ids[]integerfalsefilter to members of these teams, comma-separated or repeated
current_layer_approver_user_account_idintegerfalsefilter to timesheets whose current approval layer is staffed by this approver (their turn to act); combine with statuses=submitted for a pending-review view
statuses[]stringfalsefilter to statuses, comma-separated or repeated (not_submitted, submitted, approved, changes_requested)
date_fromstringtrueinclusive start of the window; every period overlapping it is returned (YYYY-MM-DD)
date_tostringtrueinclusive end of the window, at most 90 days after date_from; every period overlapping it is returned (YYYY-MM-DD)
pageintegerfalsepage number
per_pageintegerfalsepage size

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
approversArray of objectApprovers are the approvers responsible for reviewing this timesheet: the setup's configured approvers at the timesheet's current layer. Always populated.
capacity_minutesintegerCapacityMinutes is the member's working-capacity minutes for the period — the expected hours LoggedMinutes is measured against.
flag_countintegerFlagCount is the number of active flags on this timesheet.
logged_minutesintegerLoggedMinutes is the sum of durations for entries whose start falls in the period (in the member's timezone); an entry that overlaps but starts in an adjacent period is not counted here.
member_namestringMemberName is the member's display name, resolved from their account profile at query time. Not persisted with the timesheet, so it always reflects the member's current name.
reviewsArray of objectReviews is the name-resolved review trail (actor, action, time), oldest first, so the most recent entry is who last acted on the timesheet. Empty for virtual rows.
timesheetobjectTimesheet is the underlying record (virtual or persisted).
approvers​
NameTypeDescription
namestringName is the approver's display name, resolved from their account profile at query time.
user_account_idintegerUserAccountID identifies the approver.
reviews​
NameTypeDescription
actionstringAction is the review action taken. Valid values: submitted, withdrawn, approved, changes_requested, resubmitted, approval_withdrawn, admin_approved, admin_changes_requested.
created_atstringCreatedAt is when the action was taken.
namestringName is the actor's display name, resolved from their account profile at query time.
user_account_idintegerUserAccountID is the actor who performed the action.
timesheet​
NameTypeDescription
created_atstringCreatedAt is the row creation timestamp.
current_layerintegerCurrentLayer is the layer that must act next for the timesheet to advance. On submission it is 0 (waiting on the lowest approver layer). After the approver at the current layer approves, it advances to the next configured layer. Setup validation requires approver layers to be contiguous from 0, so in practice that next layer is N+1; the traversal (nextLayerAfter) nonetheless does not assume contiguity. The timesheet reaches Status=approved when no higher configured layer remains to act. When an approver at layer N requests changes, status becomes changes_requested with CurrentLayer=N. On resubmit, status returns to submitted with CurrentLayer=N — the chain restarts at the rejecting layer rather than at 0, preserving earlier-layer approvals.
deleted_atstringDeletedAt soft-deletes the timesheet. While set, the row is excluded from all read and materialisation paths. Set by the per-member "Delete data" action; nil means live.
end_datestringEndDate is the inclusive end of this period.
idintegerID is the surrogate key.
reviewed_atstringReviewedAt is the timestamp of the most recent review action (approve, request-changes, withdraw, admin override).
setup_idintegerSetupID references the parent TimesheetSetup, which determines the period boundaries and the approval chain.
start_datestringStartDate is the inclusive start of this period. Must align with the setup's period boundaries (validated on write).
statusstringStatus is the current lifecycle state. Valid values: not_submitted, submitted, approved, changes_requested.
submitted_atstringSubmittedAt is when the member most recently submitted (or resubmitted) the timesheet. Nil for not_submitted rows.
submitter_timezonestringSubmitterTimezone is a snapshot of the member's IANA timezone at submission time. Used so approvers see the member's data in the member's local time even if the member later changes timezone.
updated_atstringUpdatedAt tracks the last mutation.
user_account_idintegerUserAccountID identifies the member whose timesheet this is.
workspace_idintegerWorkspaceID is the workspace the timesheet belongs to.

400​

Bad Request

500​

Internal Server Error

GET List the approvers the caller can filter the approvals list by​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/approvers

Returns the approvers staffing the timesheet setups visible to the caller, each with their account ID and display name. These are the values accepted by the approver_user_account_ids filter when listing timesheets.

curl  https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/approvers \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
namestringName is the approver's display name, resolved from their account profile at query time.
user_account_idintegerUserAccountID identifies the approver.

500​

Internal Server Error

GET Get the full detail view of a timesheet​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}

Returns everything needed to review one timesheet in a single call: the record and its parent setup, the ordered approval chain, the member it belongs to, the time entries whose start falls in the period (enriched with their task and project), the active flags on those entries, and the hours summary. Visible to the member, to any approver in the setup's chain, and to workspace admins with manage_timesheet_approvals.

curl  https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id} \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
setup_idintegertruesetup ID
start_datestringtrueperiod start (YYYY-MM-DD)
user_account_idintegertruemember user account ID

Response​

200​

NameTypeDescription
approversArray of objectApprovers is the ordered approval chain at query time.
flagsArray of objectFlags are the active flags on those entries.
hoursobjectHours is the computed hours summary for the period.
memberobjectMember is the snapshotted member info (name, email, timezone).
setupobjectSetup is the parent setup at query time.
time_entriesArray of objectTimeEntries are the entries whose start falls in the period (in the member's timezone), matching what is counted and what can be flagged - not every entry overlapping the window. Each is enriched with its task (name, tags) and project (name, color, client) so the detail view renders without extra lookups.
timesheetobjectTimesheet is the underlying record.
approvers​
NameTypeDescription
created_atstringCreatedAt is the row creation timestamp.
deleted_atstringDeletedAt soft-deletes the approver assignment. While set, the row is treated as if the approver was never assigned.
idintegerID is the surrogate key.
layerintegerLayer is the 0-indexed tier of this approver in the approval chain. A layer may have multiple approvers (multiple rows sharing the same setup_id and layer); any one of them acting is enough to advance the timesheet to the next layer.
setup_idintegerSetupID references the parent TimesheetSetup.
user_account_idintegerUserAccountID is the approver's account identifier.
workspace_idintegerWorkspaceID is the workspace this approver's setup belongs to.
flags​
NameTypeDescription
approver_user_account_idintegerApproverUserAccountID is the user who created the flag.
commentstringComment is the approver's note. Required and non-empty.
created_atstringCreatedAt is the row creation timestamp.
deleted_atstringDeletedAt soft-deletes the flag. Set when the member resubmits, when the timesheet is approved, or when the underlying time entry is deleted.
idintegerID is the surrogate key.
time_entry_idintegerTimeEntryID references the time entry being flagged. The time entry must fall within the timesheet's period.
timesheet_idintegerTimesheetID references the parent Timesheet.
hours​
NameTypeDescription
billable_minutesintegerBillableMinutes is the sum of durations on entries marked billable.
billable_percentnumberBillablePercent is BillableMinutes / TotalMinutes * 100, rounded to one decimal place. Zero when TotalMinutes is zero.
expected_minutesintegerExpectedMinutes is the working capacity for the period, sourced from the capacity service.
logged_minutesintegerLoggedMinutes equals TotalMinutes; kept as a separate field so the planned-vs-logged comparison is self-documenting at the call site.
planned_minutesintegerPlannedMinutes is the sum of time block durations planned for the period.
total_minutesintegerTotalMinutes is the sum of logged time entry durations.
member​
NameTypeDescription
emailstringEmail is the member's email address, resolved from their account profile at query time. Not persisted with the timesheet.
namestringName is the member's display name, resolved from their account profile at query time. Not persisted with the timesheet, so it always reflects the member's current name.
timezonestringTimezone is the IANA timezone snapshotted at submission and read back from Timesheet.SubmitterTimezone.
user_account_idintegerUserAccountID identifies the member.
setup​
NameTypeDescription
created_atstringCreatedAt is the row creation timestamp.
deleted_atstringDeletedAt soft-deletes the setup. While set, the setup is excluded from active queries and no new periods are generated for it.
email_reminder_enabledbooleanEmailReminderEnabled gates the pending-reminder email channel for this setup. When false (the default) the reminder cron skips this setup's members even if ReminderDay/ReminderTime are set.
end_datestringEndDate is set when the setup is discontinued. While nil, the setup continues to generate periods indefinitely. When set, no new periods are generated past this date.
idintegerID is the surrogate key.
period_daysintegerPeriodDays is the length of a period in days. Required (and minimum 1) when Periodicity == PeriodicityDays. Must be nil otherwise.
periodicitystringPeriodicity defines the cadence of the timesheet periods. See the Periodicity constants for valid values. Valid values: weekly, monthly, days.
reminder_dayintegerReminderDay defines when in the period a reminder is sent to members who haven't submitted yet. Interpretation depends on Periodicity: - weekly: 0..6 (0 = Sunday) - monthly: 1..31 (clamps to month length) - days: number of days into the period Reminders are not sent when ReminderDay or ReminderTime is nil.
reminder_timestringReminderTime is the wall-clock time the reminder is sent, formatted HH:MM, interpreted in each member's own timezone (resolved when the reminder cron runs; UTC when the member's timezone is unknown). Reminders are not sent when ReminderDay or ReminderTime is nil.
start_datestringStartDate is the anchor for period computation and the inclusive start of the very first period. All subsequent period boundaries derive from this date plus the periodicity rule.
updated_atstringUpdatedAt tracks the last mutation. Nil for never-updated rows.
workspace_idintegerWorkspaceID is the workspace this setup belongs to.
time_entries​
NameTypeDescription
archived_atstring-
billableboolean-
billable_sourcestringValid values: manual, task_default.
calendar_eventobject-
calendar_event_idinteger-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
idinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
projectobject-
project_idinteger-
startstring-
tag_idsArray of integerTagIDs is the entry's manual tag override. NULL (nil) means no override: the effective tags fall through to the linked task's tags. A non-nil value — including an empty array — is entry-authoritative.
tagsArray of objectTags is the hydrated effective tag set: the override when TagIDs is set, else the linked task's active tags. Read-only.
taskobject-
task_idintegernull
time_block_idinteger-
timezonestringTimezone is the entry creator's IANA timezone snapshotted at creation; NULL when unresolved.
toggl_user_idinteger-
tracked_atstring-
typestringThe type of time entry: either an activity or a break. Valid values: activity, break.
updated_atstring-
workspace_idinteger-
calendar_event​
NameTypeDescription
all_dayboolean-
background_colorstringnull
end_timestring-
foreground_colorstringnull
html_linkstring-
idinteger-
meeting_linkstringnull
providerstring-
start_timestring-
titlestring-
project​
NameTypeDescription
archived_atstring-
clientobject-
colorstring-
custom_field_valuesArray of objectCustomFieldValues are the parent project's CF values, hydrated by callers that surface them (currently the task list, via task.service.hydrateTaskProjectCustomFieldValues which routes through customfield.Service.GetFieldsByIDs and respects the PermissionViewWorkspaceProjectCustomFields gate). Producers that don't hydrate (e.g. timeentry) leave the slice empty; omitempty hides it on those responses.
draftboolean-
idinteger-
is_templateboolean-
namestring-
permissionsArray of string-
privateboolean-
rateobject-
recurring_project_idintegerRecurringProjectID links an instance to its recurring template, so clients can lane an entry under a collapsed series.
client​
NameTypeDescription
idinteger-
namestring-
custom_field_values​
NameTypeDescription
custom_field_idinteger-
custom_field_namestring-
field_typestring-
selected_optionsArray of object-
valueobject-
selected_options​
NameTypeDescription
is_deletedboolean-
option_idinteger-
option_namestring-
rate​
NameTypeDescription
billableboolean-
currencystring-
end_atstring-
has_more_ratesboolean-
hourly_ratenumber-
project_colorstring-
project_created_atstring-
project_idinteger-
project_namestring-
project_rate_idinteger-
start_atstring-
workspace_rate_idinteger-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-
task​
NameTypeDescription
allocation_unitstringValid values: percent, flat.
archived_atstring-
assignee_user_idsArray of integer-
assigneesArray of objectA unified column for all task entity assignments
auto_log_timeboolean-
billablebooleannull
clientobject-
colorstring-
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
idinteger-
is_templateboolean-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
pinnedboolean-
positioninteger-
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_task_idinteger-
rollup_enabledboolean-
rrulestring-
sourcestring-
source_template_task_idinteger-
start_datestring-
statusobject-
status_idinteger-
status_updated_atstring-
tag_idsArray of integer-
tagsArray of object-
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
assignees​
NameTypeDescription
idinteger-
typestringValid values: user, team.
client​
NameTypeDescription
idinteger-
namestring-
custom_field_values​
NameTypeDescription
custom_field_idinteger-
custom_field_namestring-
field_typestring-
selected_optionsArray of object-
valueobject-
selected_options​
NameTypeDescription
is_deletedboolean-
option_idinteger-
option_namestring-
metadata​
NameTypeDescription
all_dayboolean-
calendar_event_idinteger-
calendar_idinteger-
extension_sourcestringBrowser-extension provenance: the source/config that produced the task and the page URL it was tracked from. Written by the extension's start-from-description flow; ExtensionURL is queryable via FindByURL.
extension_urlstring-
external_idstring-
ical_uidstring-
last_asserted_track_project_idintegerLastAssertedTrackProjectID is the Track planned_task.project_id that the Focus→Track mirror last successfully wrote for this task. Track→Focus uses it to distinguish a stale echo (Track still holds this value after a Focus-side project move) from an intentional Track-side project move. Internal mirror state, written by toggl_api focus_sync_worker; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
project_assignment​
NameTypeDescription
accuracynumber-
confirmed_atstring-
match_tierstringValid values: exact_name, similar_name.
matched_namestring-
normalized_namestring-
originstringValid values: manual, auto_suggestion, confirmed_suggestion, integration, legacy, explicit_mapping.
suggested_atstring-
project​
NameTypeDescription
archived_atstring-
clientobject-
colorstring-
custom_field_valuesArray of objectCustomFieldValues are the parent project's CF values, hydrated by callers that surface them (currently the task list, via task.service.hydrateTaskProjectCustomFieldValues which routes through customfield.Service.GetFieldsByIDs and respects the PermissionViewWorkspaceProjectCustomFields gate). Producers that don't hydrate (e.g. timeentry) leave the slice empty; omitempty hides it on those responses.
draftboolean-
idinteger-
is_templateboolean-
namestring-
permissionsArray of string-
privateboolean-
rateobject-
recurring_project_idintegerRecurringProjectID links an instance to its recurring template, so clients can lane an entry under a collapsed series.
client​
NameTypeDescription
idinteger-
namestring-
custom_field_values​
NameTypeDescription
custom_field_idinteger-
custom_field_namestring-
field_typestring-
selected_optionsArray of object-
valueobject-
rate​
NameTypeDescription
billableboolean-
currencystring-
end_atstring-
has_more_ratesboolean-
hourly_ratenumber-
project_colorstring-
project_created_atstring-
project_idinteger-
project_namestring-
project_rate_idinteger-
start_atstring-
workspace_rate_idinteger-
status​
NameTypeDescription
emojistring-
idinteger-
namestring-
typestringValid values: todo, done, in_progress, blocked.
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-
timesheet​
NameTypeDescription
created_atstringCreatedAt is the row creation timestamp.
current_layerintegerCurrentLayer is the layer that must act next for the timesheet to advance. On submission it is 0 (waiting on the lowest approver layer). After the approver at the current layer approves, it advances to the next configured layer. Setup validation requires approver layers to be contiguous from 0, so in practice that next layer is N+1; the traversal (nextLayerAfter) nonetheless does not assume contiguity. The timesheet reaches Status=approved when no higher configured layer remains to act. When an approver at layer N requests changes, status becomes changes_requested with CurrentLayer=N. On resubmit, status returns to submitted with CurrentLayer=N — the chain restarts at the rejecting layer rather than at 0, preserving earlier-layer approvals.
deleted_atstringDeletedAt soft-deletes the timesheet. While set, the row is excluded from all read and materialisation paths. Set by the per-member "Delete data" action; nil means live.
end_datestringEndDate is the inclusive end of this period.
idintegerID is the surrogate key.
reviewed_atstringReviewedAt is the timestamp of the most recent review action (approve, request-changes, withdraw, admin override).
setup_idintegerSetupID references the parent TimesheetSetup, which determines the period boundaries and the approval chain.
start_datestringStartDate is the inclusive start of this period. Must align with the setup's period boundaries (validated on write).
statusstringStatus is the current lifecycle state. Valid values: not_submitted, submitted, approved, changes_requested.
submitted_atstringSubmittedAt is when the member most recently submitted (or resubmitted) the timesheet. Nil for not_submitted rows.
submitter_timezonestringSubmitterTimezone is a snapshot of the member's IANA timezone at submission time. Used so approvers see the member's data in the member's local time even if the member later changes timezone.
updated_atstringUpdatedAt tracks the last mutation.
user_account_idintegerUserAccountID identifies the member whose timesheet this is.
workspace_idintegerWorkspaceID is the workspace the timesheet belongs to.

400​

Bad Request

403​

Forbidden

404​

Not Found

500​

Internal Server Error

GET List the active flags on a timesheet​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}/flags

Returns the active flags on a timesheet — the individual time entries an approver marked as needing attention, each with the flagging approver and their comment. Flags clear when the member resubmits, when the timesheet is approved, or when the flagged entry is deleted, so an empty list means nothing is currently disputed.

curl  https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}/flags \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
setup_idintegertruesetup ID
start_datestringtrueperiod start (YYYY-MM-DD)
user_account_idintegertruemember user account ID

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
approver_user_account_idintegerApproverUserAccountID is the user who created the flag.
commentstringComment is the approver's note. Required and non-empty.
created_atstringCreatedAt is the row creation timestamp.
deleted_atstringDeletedAt soft-deletes the flag. Set when the member resubmits, when the timesheet is approved, or when the underlying time entry is deleted.
idintegerID is the surrogate key.
time_entry_idintegerTimeEntryID references the time entry being flagged. The time entry must fall within the timesheet's period.
timesheet_idintegerTimesheetID references the parent Timesheet.

400​

Bad Request

403​

Forbidden

404​

Not Found

500​

Internal Server Error

GET Get the review audit trail of a timesheet​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}/history

Returns the review trail of a timesheet in chronological order — every submission, withdrawal, approval and change request — with the acting user, any comment left, and when it happened. Empty for a period that has never been submitted.

curl  https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}/history \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
setup_idintegertruesetup ID
start_datestringtrueperiod start (YYYY-MM-DD)
user_account_idintegertruemember user account ID

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
actionstringAction is the action that was performed. Valid values: submitted, withdrawn, approved, changes_requested, resubmitted, approval_withdrawn, admin_approved, admin_changes_requested.
actor_user_account_idintegerActorUserAccountID is the user who performed the action.
commentstringComment carries the message attached to the action. Required for changes_requested and admin_changes_requested actions; optional for others. Capped at 1000 characters.
created_atstringCreatedAt is the timestamp of the action.
idintegerID is the surrogate key.
layerintegerLayer is the approver layer at which this action was taken. Nil for actions taken outside the approver chain (admin overrides and member submissions / withdrawals).
timesheet_idintegerTimesheetID references the parent Timesheet.

400​

Bad Request

403​

Forbidden

404​

Not Found

500​

Internal Server Error

GET Get the hours summary for a timesheet period​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}/hours

Returns the time totals for a timesheet's period: logged, billable (with its share of the total), planned, and the member's expected working capacity. Only entries whose start falls in the period, in the member's timezone, are counted — an entry that overlaps the boundary belongs to the period it starts in.

curl  https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/timesheets/{setup_id}/{start_date}/{user_account_id}/hours \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
setup_idintegertruesetup ID
start_datestringtrueperiod start (YYYY-MM-DD)
user_account_idintegertruemember user account ID

Response​

200​

NameTypeDescription
billable_minutesintegerBillableMinutes is the sum of durations on entries marked billable.
billable_percentnumberBillablePercent is BillableMinutes / TotalMinutes * 100, rounded to one decimal place. Zero when TotalMinutes is zero.
expected_minutesintegerExpectedMinutes is the working capacity for the period, sourced from the capacity service.
logged_minutesintegerLoggedMinutes equals TotalMinutes; kept as a separate field so the planned-vs-logged comparison is self-documenting at the call site.
planned_minutesintegerPlannedMinutes is the sum of time block durations planned for the period.
total_minutesintegerTotalMinutes is the sum of logged time entry durations.

400​

Bad Request

403​

Forbidden

404​

Not Found

500​

Internal Server Error

© 2026 Toggl. All rights reserved.