Skip to main content

Time-blocks

GET List task time blocks​

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

Returns a list of time blocks 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-blocks \
-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
archivedbooleanfalsefilter in/out archived time blocks

Response​

200​

NameTypeDescription
dataArray of object-
pageinteger-
per_pageinteger-
data​
NameTypeDescription
archived_atstring-
calendar_event_idinteger-
completed_atstring-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
has_time_entryboolean-
idinteger-
startstring-
task_idinteger-
timezonestringTimezone is the creator's IANA timezone snapshotted at creation; NULL when unresolved.
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

POST Create a new time block​

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

Creates a new time block with the provided name and workspace ID.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/tasks/{task_id}/time-blocks \
-H "Content-Type: application/json" \
-d '\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID

Body​

NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-

Response​

201​

Time block created successfully

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

GET Get a time block by ID​

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

Returns a time block by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertruetimeBlock ID

Response​

200​

NameTypeDescription
archived_atstring-
calendar_event_idinteger-
completed_atstring-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
idinteger-
startstring-
task_idinteger-
timezonestringTimezone is the creator's IANA timezone snapshotted at creation; NULL when unresolved.
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-

400​

Invalid request

403​

Insufficient permissions

404​

TimeBlock does not exist

500​

Internal Server Error

PUT Update time block​

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

Update an existing time block

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/tasks/{task_id}/time-blocks/{time_block_id} \
-H "Content-Type: application/json" \
-d '\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertrueTimeBlock ID

Body​

NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time block does not exist

500​

Internal Server Error

DELETE Delete a time block by ID​

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

Deletes a time block by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertruetime block ID

Query​

nametyperequireddescription
outbound_syncbooleanfalseConduct outbound sync or not

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time block does not exist

500​

Internal Server Error

PATCH Update time block​

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

Update an existing time block

curl -X PATCH https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/tasks/{task_id}/time-blocks/{time_block_id} \
-H "Content-Type: application/json" \
-d '\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string","task_id":"integer"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertrueTimeBlock ID

Body​

NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-
task_idinteger-

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time block does not exist

500​

Internal Server Error

POST Marks a time block as archived​

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

Marks the time block with the provided WS, task, and time block IDs as archived

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertruetime block ID

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

PATCH Restore a time block by ID​

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

Restores a time block by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertruetime block ID

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time block does not exist

500​

Internal Server Error

POST Marks a time block as unarchived​

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

Marks the time block with the provided WS, task, and time block IDs as unarchived

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
task_idintegertruetask ID
time_block_idintegertruetime block ID

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

GET List task time blocks within range​

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

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

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
date_fromstringtruefrom timestamp
date_tostringtrueto timestamp
task_idintegerfalsetask id
status_idintegerfalsestatus id
pageintegerfalsepage number
per_pageintegerfalseresults per page
archivedbooleanfalsefilter in/out archived time blocks
order_by[]stringfalseorder by

Response​

200​

NameTypeDescription
dataArray of object-
pageinteger-
per_pageinteger-
data​
NameTypeDescription
archived_atstring-
calendar_event_idinteger-
completed_atstring-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
has_time_entryboolean-
idinteger-
startstring-
taskobject-
task_idinteger-
timezonestringTimezone is the creator's IANA timezone snapshotted at creation; NULL when unresolved.
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
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-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

POST Create new time blocks​

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

Creates new time blocks

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-blocks/bulk \
-H "Content-Type: application/json" \
-d '\{"time_blocks":[\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string","task_id":"integer"\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
time_blocksArray of object-
time_blocks​
NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-
task_idinteger-

Response​

201​

Time blocks created successfully

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

DELETE Bulk deletes time blocks by IDs​

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

Deletes time blocks by the provided IDs.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
ids[]integertruetime block IDs
outbound_syncbooleanfalseConduct outbound sync or not

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time block does not exist

500​

Internal Server Error

PATCH Update time blocks in bulk​

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

Update existing time blocks in bulk

curl -X PATCH https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/time-blocks/bulk \
-H "Content-Type: application/json" \
-d '[\{"completed":"boolean","duration":"integer","id":"integer","outbound_sync":"boolean","start":"string","task_id":"integer"\}]' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
completedboolean-
durationinteger-
idinteger-
outbound_syncboolean-
startstring-
task_idinteger-

Response​

204​

No Content

400​

Invalid request

403​

Insufficient permissions

404​

Time block does not exist

500​

Internal Server Error

GET List task time blocks within range (streamed)​

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

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

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
date_fromstringtruefrom timestamp
date_tostringtrueto timestamp
task_idintegerfalsetask id
status_idintegerfalsestatus id
archivedbooleanfalsefilter in/out archived time blocks
order_by[]stringfalseorder by

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
archived_atstring-
calendar_event_idinteger-
completed_atstring-
created_atstring-
deleted_atstring-
descriptionstring-
durationinteger-
has_time_entryboolean-
idinteger-
startstring-
taskobject-
task_idinteger-
timezonestringTimezone is the creator's IANA timezone snapshotted at creation; NULL when unresolved.
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
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-
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-
typestringValid values: todo, done, in_progress, blocked.
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

© 2026 Toggl. All rights reserved.