Skip to main content

Time-entries

GET List task time entries​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/tasks/{task_id}/time-entries

Returns a list of time-entries based on the provided workspace ID, task ID and filter params.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID

Query​

nametyperequireddescription
pageintegerfalsepage number
per_pageintegerfalseresults per page
order_by[]stringfalseorder by
typestringfalsetime entry type
archivedbooleanfalsefilter in/out archived TEs
time_block_idintegerfalsefilter by timeblock id

Response​

200​

NameTypeDescription
dataArray of object-
pageinteger-
per_pageinteger-
data​
NameTypeDescription
archived_atstring-
billableboolean-
billable_sourceobject-
calendar_event_idinteger-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
idinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
project_idinteger-
startstring-
task_idintegernull
time_block_idinteger-
toggl_user_idinteger-
tracked_atstring-
typeobject-
updated_atstring-
workspace_idinteger-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

POST Create a new time entry​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/tasks/{task_id}/time-entries

Creates a new time entry in the specified workspace. An optional user_id field can be provided to create a time entry on behalf of another user. When user_id differs from the authenticated user, the caller must have manage_time_entries permission. An optional project_id overrides the task's project for this entry. When omitted, the entry inherits the task's project.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/tasks/{task_id}/time-entries \
-H "Content-Type: application/json" \
-d '\{"billable":"boolean","calendar_event_id":"integer","description":"string","duration":"integer","planned_at":"string","planned_duration":"integer","planned_start":"string","project_id":"integer","start":"string","time_block_id":"integer","tracked_at":"string","type":\{\},"user_id":"integer"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID

Body​

NameTypeDescription
billableboolean-
calendar_event_idinteger-
descriptionstring-
durationinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
project_idinteger-
startstring-
time_block_idinteger-
tracked_atstring-
typeobject-
user_idinteger-

Response​

201​

Time entry created successfully

400​

Invalid request

403​

Insufficient permissions

422​

Required field is missing (error=required_fields_missing) or is being cleared on a grandfathered entry (error=required_fields_deletion)

500​

Internal Server Error

GET List task time entries​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries

Returns a list of time-entries based on the provided workspace ID and filter params.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
date_fromstringtruefrom timestamp
date_tostringtruefrom timestamp
task_idintegerfalsetask id
status_idintegerfalsestatus id
typestringfalsetime entry type
pageintegerfalsepage number
per_pageintegerfalseresults per page
order_by[]stringfalseorder by
archivedbooleanfalsefilter in/out archived TEs
time_block_idintegerfalsefilter by timeblock
include_tasklessbooleanfalseinclude taskless time entries

Response​

200​

NameTypeDescription
dataArray of object-
pageinteger-
per_pageinteger-
data​
NameTypeDescription
archived_atstring-
billableboolean-
billable_sourceobject-
calendar_event_idinteger-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
idinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
projectobject-
project_idinteger-
startstring-
taskobject-
task_idintegernull
time_block_idinteger-
toggl_user_idinteger-
tracked_atstring-
typeobject-
updated_atstring-
workspace_idinteger-
project​
NameTypeDescription
archived_atstring-
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.
idinteger-
is_templateboolean-
namestring-
permissionsArray of string-
privateboolean-
rateobject-
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-
task​
NameTypeDescription
archived_atstring-
assignee_user_idsArray of integer-
auto_log_timeboolean-
billableboolean-
clientobject-
colorstring-
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
end_datestring-
estimated_minsinteger-
ghost_assignee_idsArray of integer-
idinteger-
is_templateboolean-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
pinnedboolean-
positioninteger-
prioritystring-
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_task_idinteger-
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-
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-
external_idstring-
ical_uidstring-
meeting_linkstring-
project_assignmentobject-
updated_atstring-
project_assignment​
NameTypeDescription
accuracynumber-
confirmed_atstring-
match_tierstring-
matched_namestring-
normalized_namestring-
originstring-
suggested_atstring-
project​
NameTypeDescription
archived_atstring-
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.
idinteger-
is_templateboolean-
namestring-
permissionsArray of string-
privateboolean-
rateobject-
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-
typestring-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

POST Create new time entries in bulk​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/bulk

Creates new time entries in bulk for the specified workspace. An optional user_id field can be provided per entry to create time entries on behalf of another user. When user_id differs from the authenticated user, the caller must have manage_time_entries permission. task_id is optional; omitting it creates a taskless entry, optionally scoped to project_id. When both task_id and project_id are provided, project_id overrides the task's project for the entry.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/bulk \
-H "Content-Type: application/json" \
-d '[\{"billable":"boolean","calendar_event_id":"integer","description":"string","duration":"integer","planned_at":"string","planned_duration":"integer","planned_start":"string","project_id":"integer","start":"string","task_id":"integer","time_block_id":"integer","tracked_at":"string","type":\{\},"user_id":"integer"\}]' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
billableboolean-
calendar_event_idinteger-
descriptionstring-
durationinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
project_idinteger-
startstring-
task_idinteger-
time_block_idinteger-
tracked_atstring-
typeobject-
user_idinteger-

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

422​

One or more time entries violate required-field constraints (error=bulk_required_fields_missing)

500​

Internal Server Error

DELETE Delete time entries in bulk​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/bulk

Deletes time entries by the provided IDs.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
ids[]integertrueTimeEntry IDs

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time entry does not exist

500​

Internal Server Error

PATCH Partial bulk update time entry​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/bulk

Partial updates an existing time entry

curl -X PATCH https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/bulk \
-H "Content-Type: application/json" \
-d '[\{"billable":"boolean","description":"string","duration":"integer","id":"integer","planned_at":"string","planned_duration":"integer","planned_start":"string","project_id":"integer","reset_billable_to_default":"boolean","start":"string","task_id":"integer","time_block_id":"integer","tracked_at":"string","type":"string"\}]'

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
billableboolean-
descriptionstringnull
durationinteger-
idinteger-
planned_atstringnull
planned_durationintegernull
planned_startstringnull
project_idintegernull
reset_billable_to_defaultboolean-
startstringnull
task_idintegernull
time_block_idintegernull
tracked_atstringnull
typestring-

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time entry does not exist

422​

One or more time entries violate required-field constraints (error=bulk_required_fields_missing)

500​

Internal Server Error

PATCH Restore time entries in bulk​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/bulk/restore

Restores time entries by the provided IDs.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
ids[]integertrueTimeEntry IDs

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time entry does not exist

500​

Internal Server Error

GET List task time entries, streaming the response​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/stream

Returns a list of time-entries based on the provided workspace ID and filter params.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
date_fromstringtruefrom timestamp
date_tostringtruefrom timestamp
task_idintegerfalsetask id
status_idintegerfalsestatus id
typestringfalsetime entry type
order_by[]stringfalseorder by
archivedbooleanfalsefilter in/out archived TEs
include_tasklessbooleanfalseinclude taskless time entries

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
archived_atstring-
billableboolean-
billable_sourceobject-
calendar_event_idinteger-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
idinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
projectobject-
project_idinteger-
startstring-
taskobject-
task_idintegernull
time_block_idinteger-
toggl_user_idinteger-
tracked_atstring-
typeobject-
updated_atstring-
workspace_idinteger-
project​
NameTypeDescription
archived_atstring-
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.
idinteger-
is_templateboolean-
namestring-
permissionsArray of string-
privateboolean-
rateobject-
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-
task​
NameTypeDescription
archived_atstring-
assignee_user_idsArray of integer-
auto_log_timeboolean-
billableboolean-
clientobject-
colorstring-
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
end_datestring-
estimated_minsinteger-
ghost_assignee_idsArray of integer-
idinteger-
is_templateboolean-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
pinnedboolean-
positioninteger-
prioritystring-
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_task_idinteger-
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-
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-
external_idstring-
ical_uidstring-
meeting_linkstring-
project_assignmentobject-
updated_atstring-
project_assignment​
NameTypeDescription
accuracynumber-
confirmed_atstring-
match_tierstring-
matched_namestring-
normalized_namestring-
originstring-
suggested_atstring-
project​
NameTypeDescription
archived_atstring-
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.
idinteger-
is_templateboolean-
namestring-
permissionsArray of string-
privateboolean-
rateobject-
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-
status​
NameTypeDescription
emojistring-
idinteger-
namestring-
typestring-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

GET List task time entries by time block ids, streaming the response​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-entries/time-block-ids/stream

Returns a list of time-entries based on the provided workspace ID and filter params.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
time_block_id[]integertruefilter by timeblock ids

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
archived_atstring-
billableboolean-
billable_sourceobject-
calendar_event_idinteger-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
idinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
project_idinteger-
startstring-
task_idintegernull
time_block_idinteger-
toggl_user_idinteger-
tracked_atstring-
typeobject-
updated_atstring-
workspace_idinteger-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

© 2026 Toggl. All rights reserved.