Skip to main content

Composite

POST Creates the main project, project members, and milestones.​

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

Creates the main project, project members, and milestones. Milestones are automatically associated with the project.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/composite/projects \
-H "Content-Type: application/json" \
-d '\{"billable_rates":[\{"currency":"string","end_date":"string","hourly_rate":"integer","start_date":"string"\}],"members":\{"group_ids":[\{\}],"role_id":"integer","user_ids":[\{\}]\},"milestones":[\{"color":"string","completed_at":"string","due_date":"string","name":"string","project_ids":[\{\}],"team_ids":[\{\}]\}],"project":\{"auto_compute_estimates":"boolean","billable":"boolean","client_id":"integer","color":"string","completion_mode":"string","custom_fields":\{\},"description":"string","draft":"boolean","end_date":"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":[\{\}]\},"rates":[\{"currency":"string","end_at":"string","hourly_rate":"number","start_at":"string"\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
billable_ratesArray of objectThe billable rates to be created alongside the project. Uses the rate package payload shape (inclusive [start_date, end_date], integer cents).
membersobjectUser data, and other membership details for adding members to the project.
milestonesArray of objectThe milestones to be created alongside the project.
projectobjectThe project to be created
ratesArray of objectThe rates to be created alongside the project.
billable_rates​
NameTypeDescription
currencystring-
end_datestring-
hourly_rateintegerHourlyRate uses fixed hundredths of the currency's major unit for every currency (e.g. 5000 = USD 50.00 or JPY 50).
start_datestring-
members​
NameTypeDescription
group_idsArray of integer-
role_idinteger-
user_idsArray of integer-
milestones​
NameTypeDescription
colorstring-
completed_atstringnolint:lll
due_datestringnolint:lll
namestring-
project_idsArray of integer-
team_idsArray of integer-
project​
NameTypeDescription
auto_compute_estimatesboolean-
billableboolean-
client_idinteger-
colorstring-
completion_modestringValid values: manual, automatic.
custom_fieldsobject-
descriptionstring-
draftboolean-
end_datestring-
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-
rates​
NameTypeDescription
currencystring-
end_atstring-
hourly_ratenumber-
start_atstring-

Response​

201​

Composite project creation success

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

POST Creates the main task, subtasks, time blocks and time entries in bulk​

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

Creates the main task, subtasks, time blocks and time entries in bulk.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/workspaces/{workspace_id}/composite/tasks \
-H "Content-Type: application/json" \
-d '\{"estimate_allocations":[\{"allocated_mins":"integer","allocated_percent":"integer","toggl_user_id":"integer"\}],"subtasks":[\{"allocation_unit":"string","assignee_user_ids":[\{\}],"auto_log_time":"boolean","billable":"boolean","color":"string","custom_fields":\{\},"description":"string","end_date":"string","estimate_type":"string","estimated_mins":"integer","integration_ext_id":"integer","integration_source":"string","name":"string","notes":"string","pinned":"boolean","position":"integer","priority":"string","priority_at":"string","private":"boolean","project_id":"integer","rollup_enabled":"boolean","rrule":"string","start_date":"string","status_id":"integer","tag_ids":[\{\}],"team_assignee_ids":[\{\}]\}],"task":\{"allocation_unit":"string","assignee_user_ids":[\{\}],"auto_log_time":"boolean","billable":"boolean","color":"string","custom_fields":\{\},"description":"string","end_date":"string","estimate_type":"string","estimated_mins":"integer","integration_ext_id":"integer","integration_source":"string","name":"string","notes":"string","parent_task_id":"integer","pinned":"boolean","position":"integer","priority":"string","priority_at":"string","private":"boolean","project_id":"integer","recurring_task_id":"integer","rollup_enabled":"boolean","rrule":"string","start_date":"string","status_id":"integer","tag_ids":[\{\}],"team_assignee_ids":[\{\}]\},"time_blocks":[\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string"\}],"time_entry":\{"calendar_event_id":"integer","description":"string","duration":"integer","planned_at":"string","planned_duration":"integer","planned_start":"string","start":"string","tag_ids":[\{\}],"time_block":\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string"\},"time_block_id":"integer","tracked_at":"string","type":"string"\}\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueorganization ID
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
estimate_allocationsArray of objectEstimateAllocations are the main task's estimate allocations, created after the task itself. Their value kind must match the task's allocation_unit.
subtasksArray of object-
taskobject-
time_blocksArray of object-
time_entryobject-
estimate_allocations​
NameTypeDescription
allocated_minsinteger-
allocated_percentinteger-
toggl_user_idinteger-
subtasks​
NameTypeDescription
allocation_unitstringValid values: percent, flat.
assignee_user_idsArray of integer-
auto_log_timeboolean-
billableboolean-
colorstring-
custom_fieldsobject-
descriptionstring-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
integration_ext_idinteger-
integration_sourcestring-
namestring-
notesstring-
pinnedboolean-
positionintegernull
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
project_idinteger-
rollup_enabledboolean-
rrulestringnull
start_datestring-
status_idinteger-
tag_idsArray of integer-
team_assignee_idsArray of integer-
custom_fields​
task​
NameTypeDescription
allocation_unitstringValid values: percent, flat.
assignee_user_idsArray of integer-
auto_log_timeboolean-
billableboolean-
colorstring-
custom_fieldsobject-
descriptionstring-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
integration_ext_idinteger-
integration_sourcestring-
namestring-
notesstring-
parent_task_idinteger-
pinnedboolean-
positionintegernull
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
project_idinteger-
recurring_task_idinteger-
rollup_enabledboolean-
rrulestringnull
start_datestring-
status_idinteger-
tag_idsArray of integer-
team_assignee_idsArray of integer-
custom_fields​
time_blocks​
NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-
time_entry​
NameTypeDescription
calendar_event_idinteger-
descriptionstring-
durationinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
startstring-
tag_idsArray of integerTagIDs sets a manual tag override at creation (entry-authoritative, including an explicit empty array). Absent/null = no override: the entry inherits the linked task's tags.
time_blockobject-
time_block_idinteger-
tracked_atstring-
typestringThe type of time entry. This could either be an activity, or a break. Valid values: activity, break.
time_block​
NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-

Response​

201​

Composite task creation success

400​

Invalid request

403​

Insufficient permissions

404​

Task not found

409​

Allocation already exists for the entity

422​

Allocation unit mismatched, or entity not assigned

500​

Internal Server Error

POST Creates the main task, subtasks, time blocks and time entries in bulk​

https://focus.toggl.com/api/workspaces/{workspace_id}/composite/tasks

Creates the main task, subtasks, time blocks and time entries in bulk.

curl -X POST https://focus.toggl.com/api/workspaces/{workspace_id}/composite/tasks \
-H "Content-Type: application/json" \
-d '\{"estimate_allocations":[\{"allocated_mins":"integer","allocated_percent":"integer","toggl_user_id":"integer"\}],"subtasks":[\{"allocation_unit":"string","assignee_user_ids":[\{\}],"auto_log_time":"boolean","billable":"boolean","color":"string","custom_fields":\{\},"description":"string","end_date":"string","estimate_type":"string","estimated_mins":"integer","integration_ext_id":"integer","integration_source":"string","name":"string","notes":"string","pinned":"boolean","position":"integer","priority":"string","priority_at":"string","private":"boolean","project_id":"integer","rollup_enabled":"boolean","rrule":"string","start_date":"string","status_id":"integer","tag_ids":[\{\}],"team_assignee_ids":[\{\}]\}],"task":\{"allocation_unit":"string","assignee_user_ids":[\{\}],"auto_log_time":"boolean","billable":"boolean","color":"string","custom_fields":\{\},"description":"string","end_date":"string","estimate_type":"string","estimated_mins":"integer","integration_ext_id":"integer","integration_source":"string","name":"string","notes":"string","parent_task_id":"integer","pinned":"boolean","position":"integer","priority":"string","priority_at":"string","private":"boolean","project_id":"integer","recurring_task_id":"integer","rollup_enabled":"boolean","rrule":"string","start_date":"string","status_id":"integer","tag_ids":[\{\}],"team_assignee_ids":[\{\}]\},"time_blocks":[\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string"\}],"time_entry":\{"calendar_event_id":"integer","description":"string","duration":"integer","planned_at":"string","planned_duration":"integer","planned_start":"string","start":"string","tag_ids":[\{\}],"time_block":\{"completed":"boolean","duration":"integer","outbound_sync":"boolean","start":"string"\},"time_block_id":"integer","tracked_at":"string","type":"string"\}\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
workspace_idintegertrueworkspace ID

Body​

NameTypeDescription
estimate_allocationsArray of objectEstimateAllocations are the main task's estimate allocations, created after the task itself. Their value kind must match the task's allocation_unit.
subtasksArray of object-
taskobject-
time_blocksArray of object-
time_entryobject-
estimate_allocations​
NameTypeDescription
allocated_minsinteger-
allocated_percentinteger-
toggl_user_idinteger-
subtasks​
NameTypeDescription
allocation_unitstringValid values: percent, flat.
assignee_user_idsArray of integer-
auto_log_timeboolean-
billableboolean-
colorstring-
custom_fieldsobject-
descriptionstring-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
integration_ext_idinteger-
integration_sourcestring-
namestring-
notesstring-
pinnedboolean-
positionintegernull
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
project_idinteger-
rollup_enabledboolean-
rrulestringnull
start_datestring-
status_idinteger-
tag_idsArray of integer-
team_assignee_idsArray of integer-
custom_fields​
task​
NameTypeDescription
allocation_unitstringValid values: percent, flat.
assignee_user_idsArray of integer-
auto_log_timeboolean-
billableboolean-
colorstring-
custom_fieldsobject-
descriptionstring-
end_datestring-
estimate_typestringValid values: daily, total.
estimated_minsinteger-
integration_ext_idinteger-
integration_sourcestring-
namestring-
notesstring-
parent_task_idinteger-
pinnedboolean-
positionintegernull
prioritystringValid values: none, low, medium, high.
priority_atstring-
privateboolean-
project_idinteger-
recurring_task_idinteger-
rollup_enabledboolean-
rrulestringnull
start_datestring-
status_idinteger-
tag_idsArray of integer-
team_assignee_idsArray of integer-
custom_fields​
time_blocks​
NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-
time_entry​
NameTypeDescription
calendar_event_idinteger-
descriptionstring-
durationinteger-
planned_atstring-
planned_durationinteger-
planned_startstring-
startstring-
tag_idsArray of integerTagIDs sets a manual tag override at creation (entry-authoritative, including an explicit empty array). Absent/null = no override: the entry inherits the linked task's tags.
time_blockobject-
time_block_idinteger-
tracked_atstring-
typestringThe type of time entry. This could either be an activity, or a break. Valid values: activity, break.
time_block​
NameTypeDescription
completedboolean-
durationinteger-
outbound_syncboolean-
startstring-

Response​

201​

Composite task creation success

400​

Invalid request

403​

Insufficient permissions

500​

Internal Server Error

© 2026 Toggl. All rights reserved.