Skip to main content

Projects

GET List projects​

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

Returns a list of projects based on the provided workspace ID and filter params.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Query​

nametyperequireddescription
member_onlybooleanfalseOnly projects where the caller has an active project role, directly or through a team; normal visibility and lifecycle filters still apply.
include_task_countsbooleanfalseInclude permission-filtered task counts for this project page, including draft or completed projects returned by the project filters; no_project_task_count is returned on page 1. Off by default.
include_tasksbooleanfalseInclude bounded picker previews of five task groups per project and five subtasks per group, with task_group_counts and child counts for pagination; no_project_tasks and no_project_task_group_counts are returned on page 1. Off by default.
unified_searchstringfalseUnified picker search by project, client, task and subtask names before pagination. With include_tasks, projects matched by project or client name return all their tasks; other projects return only tasks and subtasks whose names match, with nonmatching parents included only as nonselectable context for matching subtasks. Overrides task_name for nested tasks; task_name still filters task counts. Literal case-insensitive substring.
include_picker_parent_group_countsbooleanfalseInclude eligible unified-picker parent-task group counts for this project page; no_project_picker_parent_group_count is returned on page 1. Off by default.
include_picker_pinned_tasksbooleanfalseOn page 1 without unified_search, return the current user's pinned tasks the unified picker offers as picker_pinned_tasks, sorted by name (at most 30). Off by default.
task_archivedbooleanfalseFilter counted tasks by archived state; omit to include both.
task_recurringbooleanfalseFilter counted tasks by recurring state, matching the tasks endpoint.
task_state[]stringfalseFilter counted tasks by state.
task_source[]stringfalseFilter counted tasks by source, matching the tasks endpoint.
task_assignee_user_id[]integerfalseCount tasks assigned to these users, OR tasks assigned directly to task_assignee_team_id.
task_assignee_team_id[]integerfalseCount tasks assigned directly to these teams; does not expand team membership.
task_include_unassignedbooleanfalseAlso count tasks or picker parent groups with no direct assignee and no live team assignment; combined with task_assignee_user_id/task_assignee_team_id as an OR for task counts.
task_namestringfalseFilter counted tasks by name independently of the project name filter; with include_tasks, search nested tasks by task, parent, project, or client name unless unified_search is supplied. unified_search overrides nested search only; task_name still filters task counts.
task_occurrence_window_datestringfalseRepeats of a recurring task dated after this date + task_occurrence_window_days are excluded from task counts, picker previews and unified task search; earlier ones remain. Default: today (UTC).
task_occurrence_window_daysintegerfalseDays after task_occurrence_window_date, 0–31. Default: 7.
pageintegerfalsepage number
per_pageintegerfalseresults per page
order_by[]stringfalseorder by. Also accepts cf_<id> / -cf_<id> to sort by any active workspace custom field. Multi_select and users CF types sort by their canonicalized (sorted) value array, so projects sharing the same set cluster together.
pinnedbooleanfalsefilter by only pinned tasks
archivedbooleanfalsefilter by archived state (true = archived only, false = active only, omit = active only, empty = all projects)
completedbooleanfalsefilter by completion state (true = completed only, false = non-completed only, empty = all projects, omit = non-completed only, or all projects when archived=true)
privatebooleanfalsefilter by project privacy (true for private, false for public)
namestringfalsefilter by project name or client name
client_id[]integerfalsefilter by client IDs
creator_id[]integerfalsefilter by project creator id
tag_id[]integerfalsefilter by tag IDs
project_id[]integerfalsefilter by project IDs
user_id[]integerfalsereturn only projects accessible by the given users (requires manage workspace users when inspecting another user). Incompatible with only_me.
only_mebooleanfalsereturn public projects union projects the current user is a member of (Track-shaped timer/picker scope; suppresses admin view_private_projects full-access and locked-private upsell during access resolution; still honors view_public_projects). Incompatible with user_id.
include_ratesbooleanfalseincludes the projects' rate data
include_rolloverbooleanfalsecomputes and returns rollover_mins on each recurring instance (off by default — opt in only when the FE displays rollover, since per-chain hydration costs an extra OLTP + 2 warehouse queries)
include_idle_recurring_templatesbooleanfalsesurface recurring templates (rrule != null) that have no live, uncompleted instance — i.e. either never materialized or every prior instance is already completed. Off by default. Useful for letting the user start the next period after dropping auto-first-instance materialization.
collapse_recurringbooleanfalseseries-shaped listing. A series appears as its template whenever the template matches the listing; instances matching filters their template does not (access, name, completed, ...) appear individually. Supersedes include_idle_recurring_templates while set. Aggregations on a template row describe the template alone (its blueprint tasks, no tracked time), not the series.
include_draftsbooleanfalseinclude draft projects in the response (default false hides them; requires view_draft_projects permission)
include_locked_privatebooleanfalseinclude the workspace's private projects read-only for role-entitled users whose plan lacks the private-projects feature (upsell flow). Their activity figures are blurred to zero. Off by default; other consumers never see private projects they can't otherwise access.
start_datestringfalsefilter projects overlapping date range (start). Used with end_date to find projects where project.start_date <= end_date AND project.end_date >= start_date
end_datestringfalsefilter projects overlapping date range (end). Used with start_date to find projects where project.start_date <= end_date AND project.end_date >= start_date
date_overlap_startstringfalse[LEGACY] use start_date instead
date_overlap_endstringfalse[LEGACY] use end_date instead
cf_filter[]stringfalsefilter by custom field values (format: fieldID:value1,value2)

Response​

200​

NameTypeDescription
dataArray of object-
no_project_picker_parent_group_countinteger-
no_project_task_countinteger-
no_project_task_group_countsobject-
no_project_tasksArray of object-
pageinteger-
per_pageinteger-
picker_pinned_tasksArray of object-
totalinteger-
data​
NameTypeDescription
activeboolean-
alert_statusobject-
archived_atstring-
auto_compute_estimatesbooleanDeprecated by estimate_source. True mirrors a computed source: "tasks" or "designation".
billableboolean-
clientobject-
client_idinteger-
colorstring-
completed_atstring-
completion_modestringValid values: manual, automatic.
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
designation_estimated_minsinteger-
draftboolean-
end_datestring-
estimate_sourcestringValid values: manual, tasks, designation.
estimated_minsinteger-
filtered_task_countinteger-
fixed_feeobject-
idinteger-
is_templateboolean-
namestring-
parent_project_idinteger-
permissionsArray of string-
picker_parent_group_countinteger-
pinnedboolean-
privateboolean-
rateobject-
recurring_project_idinteger-
rollover_minsintegernull
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestring-
source_template_idinteger-
start_datestring-
tag_idsArray of integer-
tagsArray of object-
task_estimated_minsinteger-
task_group_countsobject-
tasksArray of object-
toggl_user_idinteger-
total_tasksinteger-
total_tracked_secsinteger-
updated_atstring-
workspace_idinteger-
alert_status​
NameTypeDescription
estimate_used_pctnumber-
has_active_alertsboolean-
highest_triggered_thresholdinteger-
client​
NameTypeDescription
activeboolean-
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-
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-
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_group_counts​
NameTypeDescription
eligible_totalinteger-
matching_totalinteger-
tasks​
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-
eligible_child_countinteger-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
group_idintegerGroupID stays stable when a hidden parent is represented by an eligible child.
idinteger-
is_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
is_templateboolean-
matching_child_countinteger-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
parent_visibleboolean-
pinnedboolean-
positioninteger-
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
recurring_task_idinteger-
rollup_enabledboolean-
rrulestring-
selectablebooleanSelectable is false for ineligible parents and nonmatching context parents under unified_search.
sourcestring-
source_template_task_idinteger-
start_datestring-
statusobject-
status_idinteger-
status_updated_atstring-
subtasksArray of object-
tag_idsArray of integer-
tagsArray of object-
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
assignees​
NameTypeDescription
idinteger-
typestringValid values: user, team.
client​
NameTypeDescription
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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.
subtasks​
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_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
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_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
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
activeboolean-
idinteger-
namestring-
custom_field_values​
NameTypeDescription
custom_field_idinteger-
custom_field_namestring-
field_typestring-
selected_optionsArray of object-
valueobject-
metadata​
NameTypeDescription
all_dayboolean-
calendar_event_idinteger-
calendar_idinteger-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
project​
NameTypeDescription
archived_atstring-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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.
status​
NameTypeDescription
emojistring-
idinteger-
namestring-
typestringValid values: todo, done, in_progress, blocked.
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-
no_project_task_group_counts​
NameTypeDescription
eligible_totalinteger-
matching_totalinteger-
no_project_tasks​
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-
eligible_child_countinteger-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
group_idintegerGroupID stays stable when a hidden parent is represented by an eligible child.
idinteger-
is_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
is_templateboolean-
matching_child_countinteger-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
parent_visibleboolean-
pinnedboolean-
positioninteger-
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
recurring_task_idinteger-
rollup_enabledboolean-
rrulestring-
selectablebooleanSelectable is false for ineligible parents and nonmatching context parents under unified_search.
sourcestring-
source_template_task_idinteger-
start_datestring-
statusobject-
status_idinteger-
status_updated_atstring-
subtasksArray of object-
tag_idsArray of integer-
tagsArray of object-
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
assignees​
NameTypeDescription
idinteger-
typestringValid values: user, team.
client​
NameTypeDescription
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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.
subtasks​
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_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
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_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
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
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-
picker_pinned_tasks​
NameTypeDescription
parentobject-
projectobject-
taskobject-
parent​
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_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
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_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
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
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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-
project​
NameTypeDescription
clientobject-
colorstring-
end_datestring-
idinteger-
namestring-
pinnedboolean-
recurring_project_idinteger-
start_datestring-
client​
NameTypeDescription
activeboolean-
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_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
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_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
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
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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

500​

Internal Server Error

POST Create a new project​

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

Creates a new project with the provided name, workspace ID, parent project ID, and client ID. Omitted private inherits the parent project visibility, or the workspace default when there is no parent. Explicit values retain normal authorization.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects \
-H "Content-Type: application/json" \
-d '\{"auto_compute_estimates":"boolean","billable":"boolean","client_id":"integer","color":"string","completion_mode":"string","custom_fields":\{\},"description":"string","draft":"boolean","end_date":"string","estimate_source":"string","estimated_mins":"integer","fixed_fee":\{"amount":"number","currency":"string"\},"is_template":"boolean","name":"string","parent_project_id":"integer","pinned":"boolean","private":"boolean","rollover_mode":"string","rrule":"string","start_date":"string","tag_ids":[\{\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
auto_compute_estimatesbooleanDeprecated by estimate_source. Sets it to "tasks" if true.
billableboolean-
client_idinteger-
colorstring-
completion_modestringValid values: manual, automatic.
custom_fieldsobject-
descriptionstring-
draftboolean-
end_datestring-
estimate_sourcestringnull
estimated_minsinteger-
fixed_feeobject-
is_templateboolean-
namestring-
parent_project_idinteger-
pinnedboolean-
privateboolean-
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestring-
start_datestring-
tag_idsArray of integer-
custom_fields​
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-

Response​

201​

Project created successfully

400​

Invalid project parameters

500​

Internal Server Error

GET Get a project by ID​

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

Returns a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

200​

NameTypeDescription
activeboolean-
alert_statusobject-
archived_atstring-
auto_compute_estimatesbooleanDeprecated by estimate_source. True mirrors a computed source: "tasks" or "designation".
billableboolean-
clientobject-
client_idinteger-
colorstring-
completed_atstring-
completion_modestringValid values: manual, automatic.
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
designation_estimated_minsinteger-
draftboolean-
end_datestring-
estimate_sourcestringValid values: manual, tasks, designation.
estimated_minsinteger-
filtered_task_countinteger-
fixed_feeobject-
idinteger-
is_templateboolean-
namestring-
parent_project_idinteger-
permissionsArray of string-
picker_parent_group_countinteger-
pinnedboolean-
privateboolean-
rateobject-
recurring_project_idinteger-
rollover_minsintegernull
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestring-
source_template_idinteger-
start_datestring-
tag_idsArray of integer-
tagsArray of object-
task_estimated_minsinteger-
task_group_countsobject-
tasksArray of object-
toggl_user_idinteger-
total_tasksinteger-
total_tracked_secsinteger-
updated_atstring-
workspace_idinteger-
alert_status​
NameTypeDescription
estimate_used_pctnumber-
has_active_alertsboolean-
highest_triggered_thresholdinteger-
client​
NameTypeDescription
activeboolean-
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-
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-
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_group_counts​
NameTypeDescription
eligible_totalinteger-
matching_totalinteger-
tasks​
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-
eligible_child_countinteger-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
group_idintegerGroupID stays stable when a hidden parent is represented by an eligible child.
idinteger-
is_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
is_templateboolean-
matching_child_countinteger-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
parent_visibleboolean-
pinnedboolean-
positioninteger-
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
recurring_task_idinteger-
rollup_enabledboolean-
rrulestring-
selectablebooleanSelectable is false for ineligible parents and nonmatching context parents under unified_search.
sourcestring-
source_template_task_idinteger-
start_datestring-
statusobject-
status_idinteger-
status_updated_atstring-
subtasksArray of object-
tag_idsArray of integer-
tagsArray of object-
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
assignees​
NameTypeDescription
idinteger-
typestringValid values: user, team.
client​
NameTypeDescription
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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.
subtasks​
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_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
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_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
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
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-

400​

Invalid request

404​

Project does not exist

500​

Internal Server Error

PUT Update project​

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

Update an existing project

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id} \
-H "Content-Type: application/json" \
-d '\{"auto_compute_estimates":"boolean","billable":"boolean","client_id":"integer","color":"string","completion_mode":"string","custom_fields":\{\},"description":"string","draft":"boolean","end_date":"string","estimate_source":"string","estimated_mins":"integer","fixed_fee":\{"amount":"number","currency":"string"\},"is_template":"boolean","name":"string","parent_project_id":"integer","pinned":"boolean","private":"boolean","rollover_mode":"string","rrule":"string","start_date":"string","tag_ids":[\{\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueProject ID

Body​

NameTypeDescription
auto_compute_estimatesbooleanDeprecated by estimate_source. Sets it to "tasks" if true.
billableboolean-
client_idinteger-
colorstring-
completion_modestringValid values: manual, automatic.
custom_fieldsobject-
descriptionstring-
draftboolean-
end_datestring-
estimate_sourcestringnull
estimated_minsinteger-
fixed_feeobject-
is_templateboolean-
namestring-
parent_project_idinteger-
pinnedboolean-
privateboolean-
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestring-
start_datestring-
tag_idsArray of integer-
custom_fields​
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

DELETE Delete a project by ID​

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

Deletes a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

PATCH Patch project​

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

Partially update an existing project

curl -X PATCH https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id} \
-H "Content-Type: application/json" \
-d '\{"auto_compute_estimates":"boolean","billable":"boolean","client_id":"integer","color":"string","completion_mode":"string","custom_fields":\{\},"description":"string","draft":"boolean","end_date":"string","estimate_source":"string","estimated_mins":"integer","fixed_fee":\{"amount":"number","currency":"string"\},"name":"string","parent_project_id":"integer","pinned":"boolean","private":"boolean","rollover_mode":"string","rrule":"string","start_date":"string","tag_ids":[\{\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueProject ID

Body​

NameTypeDescription
auto_compute_estimatesbooleannull
billableboolean-
client_idintegernull
colorstringnull
completion_modestringValid values: manual, automatic.
custom_fieldsobject-
descriptionstringnull
draftboolean-
end_datestringnull
estimate_sourcestringValid values: manual, tasks, designation.
estimated_minsintegernull
fixed_feeobject-
namestring-
parent_project_idintegernull
pinnedboolean-
privateboolean-
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestringnull
start_datestringnull
tag_idsArray of integer-
custom_fields​
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

PATCH Archives a project by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/archive

Archives a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

GET Get a project with its children sub-projects by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/children

Returns a project and its children sub-projects by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Query​

nametyperequireddescription
pageintegerfalsepage number
per_pageintegerfalseresults per page
order_by[]stringfalseorder by

Response​

200​

NameTypeDescription
dataArray of object-
pageinteger-
per_pageinteger-
data​
NameTypeDescription
activeboolean-
alert_statusobject-
archived_atstring-
auto_compute_estimatesbooleanDeprecated by estimate_source. True mirrors a computed source: "tasks" or "designation".
billableboolean-
clientobject-
client_idinteger-
colorstring-
completed_atstring-
completion_modestringValid values: manual, automatic.
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
designation_estimated_minsinteger-
draftboolean-
end_datestring-
estimate_sourcestringValid values: manual, tasks, designation.
estimated_minsinteger-
filtered_task_countinteger-
fixed_feeobject-
idinteger-
is_templateboolean-
namestring-
parent_project_idinteger-
permissionsArray of string-
picker_parent_group_countinteger-
pinnedboolean-
privateboolean-
rateobject-
recurring_project_idinteger-
rollover_minsintegernull
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestring-
source_template_idinteger-
start_datestring-
tag_idsArray of integer-
tagsArray of object-
task_estimated_minsinteger-
task_group_countsobject-
tasksArray of object-
toggl_user_idinteger-
total_tasksinteger-
total_tracked_secsinteger-
updated_atstring-
workspace_idinteger-
alert_status​
NameTypeDescription
estimate_used_pctnumber-
has_active_alertsboolean-
highest_triggered_thresholdinteger-
client​
NameTypeDescription
activeboolean-
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-
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-
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_group_counts​
NameTypeDescription
eligible_totalinteger-
matching_totalinteger-
tasks​
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-
eligible_child_countinteger-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
group_idintegerGroupID stays stable when a hidden parent is represented by an eligible child.
idinteger-
is_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
is_templateboolean-
matching_child_countinteger-
metadataobject-
namestring-
notesstring-
parent_task_idinteger-
parent_task_namestring-
parent_visibleboolean-
pinnedboolean-
positioninteger-
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
projectobject-
project_idinteger-
recurrence_datestring-
recurring_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
recurring_task_idinteger-
rollup_enabledboolean-
rrulestring-
selectablebooleanSelectable is false for ineligible parents and nonmatching context parents under unified_search.
sourcestring-
source_template_task_idinteger-
start_datestring-
statusobject-
status_idinteger-
status_updated_atstring-
subtasksArray of object-
tag_idsArray of integer-
tagsArray of object-
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
assignees​
NameTypeDescription
idinteger-
typestringValid values: user, team.
client​
NameTypeDescription
activeboolean-
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-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
last_integration_dates​
NameTypeDescription
endstring-
startstring-
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-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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
activeboolean-
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.
subtasks​
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_recurring_seriesbooleanIsRecurringSeries marks a canonical series root (S). Server-owned and read-only: no current API path can set it, and the response only exposes the marker while series behavior stays disabled.
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_rulestringThe rule of the task's series (RRULE with DTSTART); omitted for a normal task and once the series has stopped.
recurring_series_idintegerThe series this task is an occurrence of; omitted for a normal task. Only the server sets it.
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
activeboolean-
idinteger-
namestring-
custom_field_values​
NameTypeDescription
custom_field_idinteger-
custom_field_namestring-
field_typestring-
selected_optionsArray of object-
valueobject-
metadata​
NameTypeDescription
all_dayboolean-
calendar_event_idinteger-
calendar_idinteger-
event_classificationstringEventClassification is the calendar provider's own classification of the event behind this task, normalised by the calendar service — see calmodels.EventClassification for the values. Absent when the provider reported no classification.
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.
last_integration_datesobjectLastIntegrationDates are the start and end dates the task's integration last sent. Integration sync overwrites the task's dates only when the source's dates differ from these, so dates set in Focus survive unrelated source edits. Internal sync state; not user-facing.
meeting_linkstring-
project_assignmentobject-
updated_atstring-
project​
NameTypeDescription
archived_atstring-
billableboolean-
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-
estimate_sourcestringValid values: manual, tasks, designation.
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.
status​
NameTypeDescription
emojistring-
idinteger-
namestring-
typestringValid values: todo, done, in_progress, blocked.
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-
tags​
NameTypeDescription
colorstring-
idinteger-
namestring-

400​

Invalid request

404​

Project does not exist

500​

Internal Server Error

GET List project memmbers​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members

Returns a list of userIDs and groupIDs that are part of the given project.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

200​

List of project members

NameTypeDescription
group_idsArray of object-
project_idinteger-
user_idsArray of object-
group_ids​
NameTypeDescription
group_idinteger-
managerbooleannull
role_idinteger-
user_ids​
NameTypeDescription
managerboolean-
user_idinteger-

400​

Invalid request

403​

Forbidden

404​

Project not found

500​

Internal Server Error

PUT Update project member role​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members

Updates the role of a project member (user or group).

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members \
-H "Content-Type: application/json" \
-d '\{"group_id":"integer","role_id":"integer","user_id":"integer"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Body​

NameTypeDescription
group_idinteger-
role_idinteger-
user_idinteger-

Response​

204​

No Content

400​

Invalid request

403​

Forbidden

404​

Project not found

500​

Internal Server Error

POST Add project members​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members

Adds users and groups to the given project.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members \
-H "Content-Type: application/json" \
-d '\{"group_ids":[\{\}],"role_id":"integer","user_ids":[\{\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Body​

NameTypeDescription
group_idsArray of integer-
role_idinteger-
user_idsArray of integer-

Response​

204​

No Content

400​

Invalid request

403​

Forbidden

404​

Project not found

500​

Internal Server Error

DELETE Remove project member​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members

Removes a single user or group from the given project.

curl -X DELETE https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/members \
-H "Content-Type: application/json" \
-d '\{"group_id":"integer","user_id":"integer"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Body​

NameTypeDescription
group_idinteger-
user_idinteger-

Response​

204​

No Content

400​

Invalid request

403​

Forbidden

404​

Project not found

500​

Internal Server Error

GET Get a project with its parent projects by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/parents

Returns a project and its parent projects by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Query​

nametyperequireddescription
pageintegerfalsepage number
per_pageintegerfalseresults per page
order_by[]stringfalseorder by

Response​

200​

NameTypeDescription
dataArray of object-
pageinteger-
per_pageinteger-
data​
NameTypeDescription
activeboolean-
archived_atstring-
auto_compute_estimatesbooleanDeprecated by estimate_source. True mirrors a computed source: "tasks" or "designation".
billableboolean-
clientobject-
client_idinteger-
colorstring-
completed_atstring-
completion_modestringValid values: manual, automatic.
created_atstring-
custom_field_valuesArray of object-
deleted_atstring-
descriptionstring-
draftboolean-
end_datestring-
estimate_sourcestringValid values: manual, tasks, designation.
estimated_minsinteger-
fixed_feeobject-
idinteger-
is_templateboolean-
namestring-
parent_project_idinteger-
permissionsArray of string-
pinnedboolean-
privateboolean-
rateobject-
recurring_project_idinteger-
rollover_modestringValid values: expire, carry_all, carry_over.
rrulestring-
source_template_idinteger-
start_datestring-
tag_idsArray of integer-
tagsArray of object-
toggl_user_idinteger-
updated_atstring-
workspace_idinteger-
client​
NameTypeDescription
activeboolean-
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-
fixed_fee​
NameTypeDescription
amountnumber-
currencystring-
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-

400​

Invalid request

404​

Project does not exist

500​

Internal Server Error

POST Pin a project by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/pinned

Pins a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

DELETE Unpin a project by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/pinned

Unpins a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

PATCH Restore a project by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/restore

Restores a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

PATCH Unarchive a project by ID​

https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/projects/{project_id}/unarchive

Unarchives a project by the provided ID.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID
project_idintegertrueproject ID

Response​

204​

No Content

400​

Invalid request

404​

Project does not exist

409​

The project or its tasks changed at the same time, try again (error=project_changed_concurrently)

500​

Internal Server Error

© 2026 Toggl. All rights reserved.