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_rateinteger-
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","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","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-
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-
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","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","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-
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-
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.