Skip to main content

Time-off

GET Get time offs of organization users​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff

Returns the time off of the given organization users with personal detail stripped: each entry carries its id, the user it belongs to, the start and end of the period, and no timestamps. The approval status, policy name, and emoji are included only for a caller who holds the manage_time_off permission on the organization; they are omitted for every other caller, and the policy name and emoji are also omitted for an entry that has no category. The endpoint stays available to any member of the organization. user_id is required and repeatable, and so is the start_date/end_date window; both are dates (YYYY-MM-DD), interpreted in UTC, and end_date is inclusive of that whole day. An entry is returned when its period overlaps the window at either edge, so an entry that starts before start_date or ends after end_date is still included.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Query​

nametyperequireddescription
user_id[]integertrueUser IDs
start_datestringtrueFrom date (YYYY-MM-DD)
end_datestringtrueTo date (YYYY-MM-DD)

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
emojistringEmoji is the emoji of the entry's time-off policy (category). Included only for a caller who holds the manage_time_off permission; omitted for everyone else and for an entry with no category.
end_timestringEndTime is the RFC3339 timestamp (UTC) the time off period ends at; always after StartTime.
policy_namestringPolicyName is the name of the entry's time-off policy (category). Included only for a caller who holds the manage_time_off permission; omitted for everyone else and for an entry with no category.
start_timestringStartTime is the RFC3339 timestamp (UTC) the time off period starts at.
statusstringStatus is the approval state of the entry: pending, approved, rejected or canceled. Included only for a caller who holds the manage_time_off permission; omitted for everyone else.
timeoff_idintegerID is the unique identifier of the time off entry.
user_idintegerUserID is the user the time off was booked for.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET List members' time off balances​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/balances

Returns each visible member's balance as of date, today when omitted, in each active policy that has balance changes. A member sees their own, a team lead also their teams', and a caller with the organization-wide view_time_off permission everyone's. Requires view_time_off_balance or manage_time_off_balance.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Query​

nametyperequireddescription
user_id[]integerfalseOnly these users, at most 500
category_id[]integerfalseOnly these policies
datestringfalseAs-of date (YYYY-MM-DD)

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
balancenumberBalance is the sum of the as-of year's changes up to the as-of date, in days.
carried_overnumberCarriedOver is the sum of changes before the as-of year, in days. It does not expire.
schedulednumberScheduled is the days booked after the as-of date. Not yet subtracted from Balance.
takennumberTaken is the days used in the as-of year up to the as-of date. Already subtracted from Balance.
time_off_category_idintegerTimeOffCategoryID is the policy.
user_idintegerUserID is the member.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

POST Adjust a member's time off balance​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/balances

Records a manual change to a member's balance in a policy. The user must be an active member and the policy the organization's. Requires manage_time_off_balance. Responds 201 with the recorded change.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/timeoff/balances \
-H "Content-Type: application/json" \
-d '\{"amount":"number","date":"string","note":"string","time_off_category_id":"integer","user_id":"integer"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Body​

NameTypeDescription
amountnumberAmount is the signed change in days; not zero.
datestringDate is when the change takes effect, as RFC3339; its UTC day counts, and its year is the accrual year. Now when omitted.
notestringNote is recorded with the change; up to 2000 characters.
time_off_category_idintegerTimeOffCategoryID is the policy.
user_idintegerUserID is the member.

Response​

201​

Successful operation

400​

Invalid parameters

403​

Forbidden, or the user is not an active member

404​

Policy not found

500​

Internal Server Error

POST Set members' starting balances​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/balances/bulk

Sets each member's starting balance in one policy for the current year, in one transaction; resending the same rows changes nothing. The policy must be limited, yearly or one-off, with a yearly allowance above 0. At most 10,000 rows and 2 MiB. Rows of members not eligible for a balance are skipped and reported. Any invalid row fails the request with 422 and the row failures, and nothing is written. Requires manage_time_off_balance.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/timeoff/balances/bulk \
-H "Content-Type: application/json" \
-d '\{"category_id":"integer","rows":[\{"amount":"number","user_account_id":"integer"\}]\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Body​

NameTypeDescription
category_idintegerCategoryID is the policy: limited, yearly or one-off, with a yearly allowance above 0.
rowsArray of objectRows are the members' starting balances; 1 to 10,000, each member once.
rows​
NameTypeDescription
amountnumberAmount is the member's starting balance for the current year, in days: 0 to the policy's DefaultAmountPerYear plus MaxCarryOverAmount.
user_account_idintegerUserAccountID is the member.

Response​

200​

Written, including any skipped rows

NameTypeDescription
failuresArray of objectFailures are invalid rows; any failure means nothing was written.
skippedArray of objectSkipped are rows left unchanged; the other rows are still written.
writtenintegerWritten is the number of members whose starting balance was set; 0 when there are Failures.
failures​
NameTypeDescription
codestringCode is unknown_member (not in the organization), duplicate_member (listed earlier) or amount_invalid (outside the allowed range). Valid values: unknown_member, duplicate_member, amount_invalid.
rowintegerRow is the 1-based position in Rows.
skipped​
NameTypeDescription
codestringCode is not_eligible: the member is inactive or not assigned the Time Off module. Valid values: not_eligible.
rowintegerRow is the 1-based position in Rows.
user_account_idintegerUserAccountID is the member.

400​

Invalid parameters

403​

Forbidden

404​

Policy not found

422​

Invalid rows; nothing written

500​

Internal Server Error

GET List time off policies​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories

Returns the organization's time off policies, archived ones included. Entries reference a policy by time_off_category_id. Requires the view_time_off_categories organization permission.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
accrual_frequencystringAccrualFrequency is how the allowance is credited: yearly, monthly (a twelfth each month) or one_off (once, as a starting balance). Valid values: yearly, monthly, one_off.
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
allowance_typestringAllowanceType is limited, tracked against a balance, or unlimited. Valid values: limited, unlimited.
archived_atstringArchivedAt is when the policy was archived; omitted while it is active.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance, so a request within the limit can still go to review. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last; omitted when unset. Stored only, not applied yet: carried-over days do not expire.
created_atstringCreatedAt is when the policy was created.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days. Unused by unlimited policies.
descriptionstringDescription is the policy's description; null when unset.
emojistringEmoji is shown next to the name.
idintegerID is the policy's id. Entries reference it as time_off_category_id.
is_system_defaultbooleanIsSystemDefault marks the organization's default policy, created automatically.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy.
namestringName is the policy's name.
organization_idintegerOrganizationID is the organization the policy belongs to.
policy_linkstringPolicyLink is a URL to the written policy; omitted when unset.
proratestringProrate is when proration was turned on; null when off. With proration, a member's first-year allowance covers only the months left after the later of this date and their join date.
updated_atstringUpdatedAt is when the policy was last changed.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

POST Create a time off policy​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories

Creates a time off policy. A limited policy with an allowance credits every member assigned the Time Off module at once: this year's allowance, prorated when prorate is true, or this month's share on a monthly policy. Requires create_time_off_categories. Responds 201 with the policy.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories \
-H "Content-Type: application/json" \
-d '\{"accrual_frequency":"string","allow_negative_balance":"boolean","allowance_type":"string","auto_approve_under_days":"integer","carry_over_expiry_months":"integer","default_amount_per_year":"integer","description":"string","emoji":"string","max_carry_over_amount":"integer","name":"string","policy_link":"string","prorate":"boolean"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Body​

NameTypeDescription
accrual_frequencystringAccrualFrequency is how the allowance is credited: yearly (default), monthly (a twelfth each month) or one_off (once, as a starting balance). Unlimited policies are always one_off. Fixed after creation. Valid values: yearly, monthly, one_off.
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
allowance_typestringAllowanceType is limited (default), tracked against a balance, or unlimited. Fixed after creation. Valid values: limited, unlimited.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last, at least 1. Stored only, not applied yet: carried-over days do not expire.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days, up to 999. Unused by unlimited policies.
descriptionstringDescription is the policy's description; up to 1000 characters.
emojistringEmoji is shown next to the name.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy, up to 999.
namestringName is the policy's name; up to 255 characters.
policy_linkstringPolicyLink is a URL to the written policy; up to 2048 characters.
proratebooleanProrate true sets the proration date to now, also when proration is already on; false turns it off. With proration, a member's first-year allowance covers only the months left after the later of that date and their join date.

Response​

201​

Successful operation

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET Get a time off policy​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}

Returns one time off policy. Requires the view_time_off_categories organization permission.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
category_idintegertruePolicy ID

Response​

200​

NameTypeDescription
accrual_frequencystringAccrualFrequency is how the allowance is credited: yearly, monthly (a twelfth each month) or one_off (once, as a starting balance). Valid values: yearly, monthly, one_off.
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
allowance_typestringAllowanceType is limited, tracked against a balance, or unlimited. Valid values: limited, unlimited.
archived_atstringArchivedAt is when the policy was archived; omitted while it is active.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance, so a request within the limit can still go to review. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last; omitted when unset. Stored only, not applied yet: carried-over days do not expire.
created_atstringCreatedAt is when the policy was created.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days. Unused by unlimited policies.
descriptionstringDescription is the policy's description; null when unset.
emojistringEmoji is shown next to the name.
idintegerID is the policy's id. Entries reference it as time_off_category_id.
is_system_defaultbooleanIsSystemDefault marks the organization's default policy, created automatically.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy.
namestringName is the policy's name.
organization_idintegerOrganizationID is the organization the policy belongs to.
policy_linkstringPolicyLink is a URL to the written policy; omitted when unset.
proratestringProrate is when proration was turned on; null when off. With proration, a member's first-year allowance covers only the months left after the later of this date and their join date.
updated_atstringUpdatedAt is when the policy was last changed.

400​

Invalid parameters

403​

Forbidden

404​

Policy not found

500​

Internal Server Error

PUT Update a time off policy​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}

Replaces a policy's settings. Send every field: an omitted one is cleared or zeroed. The policy as read is the template, except that prorate is sent as true or false; true sets the proration date to the request time, also when proration is already on. accrual_frequency and allowance_type cannot change. Requires update_time_off_categories.

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id} \
-H "Content-Type: application/json" \
-d '\{"allow_negative_balance":"boolean","auto_approve_under_days":"integer","carry_over_expiry_months":"integer","default_amount_per_year":"integer","description":"string","emoji":"string","max_carry_over_amount":"integer","name":"string","policy_link":"string","prorate":"boolean"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
category_idintegertruePolicy ID

Body​

NameTypeDescription
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last, at least 1. Stored only, not applied yet: carried-over days do not expire.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days, up to 999. Unused by unlimited policies.
descriptionstringDescription is the policy's description; up to 1000 characters.
emojistringEmoji is shown next to the name.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy, up to 999.
namestringName is the policy's name; up to 255 characters.
policy_linkstringPolicyLink is a URL to the written policy; up to 2048 characters.
proratebooleanProrate true sets the proration date to now, also when proration is already on; false turns it off. With proration, a member's first-year allowance covers only the months left after the later of that date and their join date.

Response​

200​

NameTypeDescription
accrual_frequencystringAccrualFrequency is how the allowance is credited: yearly, monthly (a twelfth each month) or one_off (once, as a starting balance). Valid values: yearly, monthly, one_off.
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
allowance_typestringAllowanceType is limited, tracked against a balance, or unlimited. Valid values: limited, unlimited.
archived_atstringArchivedAt is when the policy was archived; omitted while it is active.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance, so a request within the limit can still go to review. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last; omitted when unset. Stored only, not applied yet: carried-over days do not expire.
created_atstringCreatedAt is when the policy was created.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days. Unused by unlimited policies.
descriptionstringDescription is the policy's description; null when unset.
emojistringEmoji is shown next to the name.
idintegerID is the policy's id. Entries reference it as time_off_category_id.
is_system_defaultbooleanIsSystemDefault marks the organization's default policy, created automatically.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy.
namestringName is the policy's name.
organization_idintegerOrganizationID is the organization the policy belongs to.
policy_linkstringPolicyLink is a URL to the written policy; omitted when unset.
proratestringProrate is when proration was turned on; null when off. With proration, a member's first-year allowance covers only the months left after the later of this date and their join date.
updated_atstringUpdatedAt is when the policy was last changed.

400​

Invalid parameters

403​

Forbidden

404​

Policy not found

500​

Internal Server Error

DELETE Delete a time off policy​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}

Deletes a policy no entry uses. Answers 409 with time_off_category_in_use when one does or time_off_category_system_default for the default policy. Requires delete_time_off_categories.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
category_idintegertruePolicy ID

Response​

204​

No content

400​

Invalid parameters

403​

Forbidden

404​

Policy not found

409​

Policy in use or default policy

500​

Internal Server Error

POST Archive a time off policy​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}/archive

Archives a policy. Requires update_time_off_categories.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}/archive \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
category_idintegertruePolicy ID

Response​

200​

NameTypeDescription
accrual_frequencystringAccrualFrequency is how the allowance is credited: yearly, monthly (a twelfth each month) or one_off (once, as a starting balance). Valid values: yearly, monthly, one_off.
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
allowance_typestringAllowanceType is limited, tracked against a balance, or unlimited. Valid values: limited, unlimited.
archived_atstringArchivedAt is when the policy was archived; omitted while it is active.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance, so a request within the limit can still go to review. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last; omitted when unset. Stored only, not applied yet: carried-over days do not expire.
created_atstringCreatedAt is when the policy was created.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days. Unused by unlimited policies.
descriptionstringDescription is the policy's description; null when unset.
emojistringEmoji is shown next to the name.
idintegerID is the policy's id. Entries reference it as time_off_category_id.
is_system_defaultbooleanIsSystemDefault marks the organization's default policy, created automatically.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy.
namestringName is the policy's name.
organization_idintegerOrganizationID is the organization the policy belongs to.
policy_linkstringPolicyLink is a URL to the written policy; omitted when unset.
proratestringProrate is when proration was turned on; null when off. With proration, a member's first-year allowance covers only the months left after the later of this date and their join date.
updated_atstringUpdatedAt is when the policy was last changed.

400​

Invalid parameters

403​

Forbidden

404​

Policy not found

500​

Internal Server Error

POST Restore a time off policy​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}/restore

Restores an archived policy. Requires update_time_off_categories.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/timeoff/categories/{category_id}/restore \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
category_idintegertruePolicy ID

Response​

200​

NameTypeDescription
accrual_frequencystringAccrualFrequency is how the allowance is credited: yearly, monthly (a twelfth each month) or one_off (once, as a starting balance). Valid values: yearly, monthly, one_off.
allow_negative_balancebooleanAllowNegativeBalance lets a member's own request take a limited balance below zero.
allowance_typestringAllowanceType is limited, tracked against a balance, or unlimited. Valid values: limited, unlimited.
archived_atstringArchivedAt is when the policy was archived; omitted while it is active.
auto_approve_under_daysintegerAutoApproveUnderDays is the longest own request, in days, a member can have approved without review. A limited policy also checks the balance, so a request within the limit can still go to review. 0 turns it off.
carry_over_expiry_monthsintegerCarryOverExpiryMonths is how many months carried-over days are meant to last; omitted when unset. Stored only, not applied yet: carried-over days do not expire.
created_atstringCreatedAt is when the policy was created.
default_amount_per_yearintegerDefaultAmountPerYear is the yearly allowance in days. Unused by unlimited policies.
descriptionstringDescription is the policy's description; null when unset.
emojistringEmoji is shown next to the name.
idintegerID is the policy's id. Entries reference it as time_off_category_id.
is_system_defaultbooleanIsSystemDefault marks the organization's default policy, created automatically.
max_carry_over_amountintegerMaxCarryOverAmount is how many unused days carry into the next year on a yearly policy.
namestringName is the policy's name.
organization_idintegerOrganizationID is the organization the policy belongs to.
policy_linkstringPolicyLink is a URL to the written policy; omitted when unset.
proratestringProrate is when proration was turned on; null when off. With proration, a member's first-year allowance covers only the months left after the later of this date and their join date.
updated_atstringUpdatedAt is when the policy was last changed.

400​

Invalid parameters

403​

Forbidden

404​

Policy not found

500​

Internal Server Error

GET List time off entries​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries

Returns a page of time off entries, latest start first, in any status unless filtered. A member sees their own entries, a team lead also their teams', and a caller with the organization-wide view_time_off permission everyone's; filters only narrow that set. from and to select entries overlapping the days between them, both included. id is the value the per-user entry endpoints call timeoff_id; dates carry no offset and are UTC.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Query​

nametyperequireddescription
user_id[]integerfalseOnly these users
team_idintegerfalseOnly this team; the caller must lead it or view the whole organization
category_idintegerfalseOnly this policy
status[]stringfalseOnly these statuses: pending, approved, rejected, canceled
fromstringfalseWindow start (YYYY-MM-DD)
tostringfalseWindow end (YYYY-MM-DD)
pageintegerfalsePage number, from 1
rowsintegerfalsePage size, 1 to 500 (default 50)

Response​

200​

NameTypeDescription
dataArray of objectData is the page's entries.
pageintegerPage is the 1-based page number.
rowsintegerRows is the page size.
totalintegerTotal is the number of entries across all pages; omitted when zero.
data​
NameTypeDescription
approved_atstringApprovedAt is when the entry was approved; omitted when it never was, and for entries created through the API.
approver_emailstringApproverEmail is the approver's email; empty without an approver.
approver_idintegerApproverID is the member who approved or rejected the entry; omitted when no member did.
approver_namestringApproverName is the approver's name; empty without an approver.
approver_user_account_idintegerApproverUserAccountID equals ApproverID.
created_atstringCreatedAt is when the entry was created.
created_byintegerCreatedBy is the member who created the entry; omitted when not recorded.
creator_emailstringCreatorEmail is the creator's email; empty when CreatedBy is omitted.
creator_namestringCreatorName is the creator's name; empty when CreatedBy is omitted.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count; empty when it has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown.
end_datestringEndDate is the day the entry ends, in UTC: YYYY-MM-DDT00:00:00.
idintegerID is the entry's id; the per-user entry endpoints call it timeoff_id.
notestringNote is the requester's note.
organization_idintegerOrganizationID is the entry's organization.
rejection_reasonstringRejectionReason is the reason given on rejection; empty otherwise.
requester_emailstringRequesterEmail is the member's email.
requester_namestringRequesterName is the member's name.
requester_user_account_idintegerRequesterUserAccountID is the entry's member; equals UserID.
start_datestringStartDate is when the entry starts, in UTC without an offset: YYYY-MM-DDTHH:MM:SS.
statusstringStatus is the approval state. Valid values: pending, approved, rejected, canceled.
time_off_category_idintegerTimeOffCategoryID is the entry's policy; omitted when it has none.
updated_atstringUpdatedAt is when the entry was last changed.
user_idintegerUserID is the member the entry belongs to.
daily_breakdown​
NameTypeDescription
datestringDate is the day, in UTC: YYYY-MM-DDT00:00:00.
takennumberTaken is the part of the day taken, 0 to 1.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET Get a time off entry​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}

Returns one time off entry in any status, with the names and emails of its requester, approver and creator. Open to the entry's owner, a team lead of the owner, and a caller with the organization-wide view_time_off permission.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
entry_idintegertrueEntry ID

Response​

200​

NameTypeDescription
approved_atstringApprovedAt is when the entry was approved; omitted when it never was, and for entries created through the API.
approver_emailstringApproverEmail is the approver's email; empty without an approver.
approver_idintegerApproverID is the member who approved or rejected the entry; omitted when no member did.
approver_namestringApproverName is the approver's name; empty without an approver.
approver_user_account_idintegerApproverUserAccountID equals ApproverID.
created_atstringCreatedAt is when the entry was created.
created_byintegerCreatedBy is the member who created the entry; omitted when not recorded.
creator_emailstringCreatorEmail is the creator's email; empty when CreatedBy is omitted.
creator_namestringCreatorName is the creator's name; empty when CreatedBy is omitted.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count; empty when it has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown.
end_datestringEndDate is the day the entry ends, in UTC: YYYY-MM-DDT00:00:00.
idintegerID is the entry's id; the per-user entry endpoints call it timeoff_id.
notestringNote is the requester's note.
organization_idintegerOrganizationID is the entry's organization.
rejection_reasonstringRejectionReason is the reason given on rejection; empty otherwise.
requester_emailstringRequesterEmail is the member's email.
requester_namestringRequesterName is the member's name.
requester_user_account_idintegerRequesterUserAccountID is the entry's member; equals UserID.
start_datestringStartDate is when the entry starts, in UTC without an offset: YYYY-MM-DDTHH:MM:SS.
statusstringStatus is the approval state. Valid values: pending, approved, rejected, canceled.
time_off_category_idintegerTimeOffCategoryID is the entry's policy; omitted when it has none.
updated_atstringUpdatedAt is when the entry was last changed.
user_idintegerUserID is the member the entry belongs to.
daily_breakdown​
NameTypeDescription
datestringDate is the day, in UTC: YYYY-MM-DDT00:00:00.
takennumberTaken is the part of the day taken, 0 to 1.

400​

Invalid parameters

403​

Forbidden

404​

Entry not found

500​

Internal Server Error

PUT Approve a time off entry​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}/approve

Approves a pending entry, charges its days to the requester's balance in its policy, and notifies the requester as the web app does. Requires the organization-wide approve_time_off permission or leading a team of the requester. Answers 409 when the entry is not pending.

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}/approve \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
entry_idintegertrueEntry ID

Response​

200​

NameTypeDescription
approved_atstringApprovedAt is when the entry was approved; omitted when it never was, and for entries created through the API.
approver_idintegerApproverID is the member who approved or rejected the entry; omitted when no member did.
created_atstringCreatedAt is when the entry was created.
created_byintegerCreatedBy is the member who created the entry; omitted when not recorded.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count; empty when it has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown.
end_datestringEndDate is the day the entry ends, in UTC: YYYY-MM-DDT00:00:00.
idintegerID is the entry's id; the per-user entry endpoints call it timeoff_id.
notestringNote is the requester's note.
organization_idintegerOrganizationID is the entry's organization.
rejection_reasonstringRejectionReason is the reason given on rejection; empty otherwise.
start_datestringStartDate is when the entry starts, in UTC without an offset: YYYY-MM-DDTHH:MM:SS.
statusstringStatus is the approval state. Valid values: pending, approved, rejected, canceled.
time_off_category_idintegerTimeOffCategoryID is the entry's policy; omitted when it has none.
updated_atstringUpdatedAt is when the entry was last changed.
user_idintegerUserID is the member the entry belongs to.
daily_breakdown​
NameTypeDescription
datestringDate is the day, in UTC: YYYY-MM-DDT00:00:00.
takennumberTaken is the part of the day taken, 0 to 1.

400​

Invalid parameters

403​

Forbidden

404​

Entry not found

409​

Entry not pending

500​

Internal Server Error

PUT Cancel a time off entry​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}/cancel

Cancels a pending or approved entry and returns any days it charged. Notifies the requester unless they cancel it themselves. Open to the entry's owner, a team lead of the owner, and a caller with the organization-wide cancel_time_off permission. Answers 409 when the entry is already rejected or canceled.

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}/cancel \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
entry_idintegertrueEntry ID

Response​

200​

NameTypeDescription
approved_atstringApprovedAt is when the entry was approved; omitted when it never was, and for entries created through the API.
approver_idintegerApproverID is the member who approved or rejected the entry; omitted when no member did.
created_atstringCreatedAt is when the entry was created.
created_byintegerCreatedBy is the member who created the entry; omitted when not recorded.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count; empty when it has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown.
end_datestringEndDate is the day the entry ends, in UTC: YYYY-MM-DDT00:00:00.
idintegerID is the entry's id; the per-user entry endpoints call it timeoff_id.
notestringNote is the requester's note.
organization_idintegerOrganizationID is the entry's organization.
rejection_reasonstringRejectionReason is the reason given on rejection; empty otherwise.
start_datestringStartDate is when the entry starts, in UTC without an offset: YYYY-MM-DDTHH:MM:SS.
statusstringStatus is the approval state. Valid values: pending, approved, rejected, canceled.
time_off_category_idintegerTimeOffCategoryID is the entry's policy; omitted when it has none.
updated_atstringUpdatedAt is when the entry was last changed.
user_idintegerUserID is the member the entry belongs to.
daily_breakdown​
NameTypeDescription
datestringDate is the day, in UTC: YYYY-MM-DDT00:00:00.
takennumberTaken is the part of the day taken, 0 to 1.

400​

Invalid parameters

403​

Forbidden

404​

Entry not found

409​

Entry already rejected or canceled

500​

Internal Server Error

PUT Reject a time off entry​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}/reject

Rejects a pending entry and notifies the requester, with the reason when given, as the web app does. The body is optional. Access as for approving. Answers 409 when the entry is not pending.

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/timeoff/entries/{entry_id}/reject \
-H "Content-Type: application/json" \
-d '\{"reason":"string"\}' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
entry_idintegertrueEntry ID

Body​

NameTypeDescription
reasonstringReason is shown to the requester; optional.

Response​

200​

NameTypeDescription
approved_atstringApprovedAt is when the entry was approved; omitted when it never was, and for entries created through the API.
approver_idintegerApproverID is the member who approved or rejected the entry; omitted when no member did.
created_atstringCreatedAt is when the entry was created.
created_byintegerCreatedBy is the member who created the entry; omitted when not recorded.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count; empty when it has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown.
end_datestringEndDate is the day the entry ends, in UTC: YYYY-MM-DDT00:00:00.
idintegerID is the entry's id; the per-user entry endpoints call it timeoff_id.
notestringNote is the requester's note.
organization_idintegerOrganizationID is the entry's organization.
rejection_reasonstringRejectionReason is the reason given on rejection; empty otherwise.
start_datestringStartDate is when the entry starts, in UTC without an offset: YYYY-MM-DDTHH:MM:SS.
statusstringStatus is the approval state. Valid values: pending, approved, rejected, canceled.
time_off_category_idintegerTimeOffCategoryID is the entry's policy; omitted when it has none.
updated_atstringUpdatedAt is when the entry was last changed.
user_idintegerUserID is the member the entry belongs to.
daily_breakdown​
NameTypeDescription
datestringDate is the day, in UTC: YYYY-MM-DDT00:00:00.
takennumberTaken is the part of the day taken, 0 to 1.

400​

Invalid parameters

403​

Forbidden

404​

Entry not found

409​

Entry not pending

500​

Internal Server Error

GET Get the absence report​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/reports/absence

Returns leave and balances per member and policy over a period of at most 732 days: balance figures as of end_date, and leave inside the period split at today. Covers everyone for a caller with the organization-wide view_time_off permission, the led teams for a team lead, otherwise the caller alone. Requires view_time_off_balance or manage_time_off_balance.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Query​

nametyperequireddescription
start_datestringtruePeriod start (YYYY-MM-DD)
end_datestringtruePeriod end (YYYY-MM-DD)
user_id[]integerfalseOnly these users
team_id[]integerfalseOnly these teams, at most 50
category_id[]integerfalseOnly these policies
include_pendingbooleanfalseCount pending leave as scheduled

Response​

200​

NameTypeDescription
end_datestringEndDate is the period's last day: YYYY-MM-DD.
rowsArray of objectRows has one row per member and active policy with any non-zero figure, by member name.
start_datestringStartDate is the period's first day: YYYY-MM-DD.
totalsobjectTotals sums Rows.
rows​
NameTypeDescription
absence_ratenumberAbsenceRate is TakenInPeriod divided by WorkingDaysInPeriod.
allowance_typestringAllowanceType is the policy's allowance type. Valid values: limited, unlimited.
balancenumberBalance is the sum of changes in EndDate's year up to EndDate, in days; 0 for an unlimited policy.
category_emojistringCategoryEmoji is the policy's emoji.
category_idintegerCategoryID is the policy.
category_namestringCategoryName is the policy's name.
scheduled_after_period_endnumberScheduledAfterPeriodEnd is the days entries charge after EndDate.
scheduled_in_periodnumberScheduledInPeriod is the approved leave days in the period after today, plus pending ones when requested.
taken_in_periodnumberTakenInPeriod is the approved leave days in the period up to today.
taken_through_period_endnumberTakenThroughPeriodEnd is the days entries charged in EndDate's year up to EndDate.
user_idintegerUserID is the member.
user_namestringUserName is the member's name.
working_days_in_periodintegerWorkingDaysInPeriod is the Monday to Friday days in the period.
totals​
NameTypeDescription
absence_ratenumberAbsenceRate is TakenInPeriod divided by working days times UserCount.
balancenumberBalance sums the rows' Balance.
scheduled_after_period_endnumberScheduledAfterPeriodEnd sums the rows' ScheduledAfterPeriodEnd.
scheduled_in_periodnumberScheduledInPeriod sums the rows' ScheduledInPeriod.
taken_in_periodnumberTakenInPeriod sums the rows' TakenInPeriod.
taken_through_period_endnumberTakenThroughPeriodEnd sums the rows' TakenThroughPeriodEnd.
user_countintegerUserCount is the members the report covers, including those without rows.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET List the time off timeline​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/timeline

Returns the time off entries overlapping the days from from to to, both included, ordered by start: pending and approved unless status says otherwise. Visibility and filters as in the entries list; no pagination.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Query​

nametyperequireddescription
user_id[]integerfalseOnly these users
team_idintegerfalseOnly this team; the caller must lead it or view the whole organization
category_idintegerfalseOnly this policy
status[]stringfalseOnly these statuses: pending, approved, rejected, canceled
fromstringfalseWindow start (YYYY-MM-DD)
tostringfalseWindow end (YYYY-MM-DD)

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
days_spanintegerDaysSpan is the number of calendar days from StartDate to EndDate, both included.
days_takennumberDaysTaken is the entry's day count.
end_datestringEndDate is the day the entry ends, in UTC: YYYY-MM-DDT00:00:00.
idintegerID is the entry's id.
requester_namestringRequesterName is the member's name.
start_datestringStartDate is the entry's first day, in UTC: YYYY-MM-DDT00:00:00.
statusstringStatus is the approval state. Valid values: pending, approved, rejected, canceled.
time_off_category_idintegerTimeOffCategoryID is the entry's policy; omitted when it has none.
user_idintegerUserID is the member the entry belongs to.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET Get time off for organization user​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}

Returns the full time off entries of one organization user, including the category and the creation and last-modification timestamps. Requires the manage_time_off organization permission — this applies to reading as well, and to a caller's own entries. The from/to window is required; both are dates (YYYY-MM-DD), interpreted in UTC, and to is inclusive of that whole day. An entry is returned when its period overlaps the window at either edge, so an entry that starts before from or ends after to is still included.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
user_idintegertrueUser ID

Query​

nametyperequireddescription
fromstringtrueFrom date (YYYY-MM-DD)
tostringtrueTo date (YYYY-MM-DD)

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
created_atstringCreatedAt is the RFC3339 timestamp (UTC) the entry was created at.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count. Omitted when the entry has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown. Omitted when zero.
emojistringEmoji is the emoji of the entry's time-off policy (category). Omitted from create and update responses and for an entry without a policy.
end_timestringEndTime is the RFC3339 timestamp (UTC) the time off period ends at; always after StartTime.
organization_idintegerOrganizationID is the organization the entry belongs to.
policy_namestringPolicyName is the name of the entry's time-off policy (category). Omitted from create and update responses and for an entry without a policy.
start_timestringStartTime is the RFC3339 timestamp (UTC) the time off period starts at.
statusstringStatus is the approval state of the entry: pending, approved, rejected or canceled.
time_off_category_idintegerTimeOffCategoryID is the id of the entry's time-off policy (category). Omitted when the entry has no policy.
timeoff_idintegerID is the unique identifier of the time off entry.
typestringType is the legacy type enum: vacation, sick, parental or other. Independent of TimeOffCategoryID; omitted when unset.
updated_atstringUpdatedAt is the RFC3339 timestamp (UTC) the entry was last modified at.
user_idintegerUserID is the user the time off was booked for.
daily_breakdown​
NameTypeDescription
datestringDate is the day, as an RFC3339 timestamp at 00:00 UTC.
takennumberTaken is the part of the day taken, from 0 to 1: 1 for a full day, 0.5 for a half day, 0 for a weekend or holiday.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

PUT Update time off for the specified user​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}

Updates one or more existing time off entries of the specified user in a single call. The request body is an array: each element identifies the entry by its timeoff_id and carries the new start_time and end_time (RFC3339) plus an optional type, time_off_category_id and daily_breakdown. Omitting type clears it. Omitting time_off_category_id or daily_breakdown keeps the stored value; a kept breakdown must still fall within the new dates, or the request fails with a 400. Include each timeoff_id at most once: with duplicates, which element wins is undefined. Elements whose timeoff_id does not match an entry of the user are skipped. All elements are applied in a single transaction: if applying them would leave any two of the user's approved or pending time off entries overlapping (entries created through this API are approved), the whole request fails with a 409 and nothing is updated. Requires the manage_time_off organization permission. Responds 200 with the entries that were actually updated.

curl -X PUT https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id} \
-H "Content-Type: application/json" \
-d '[\{"daily_breakdown":[\{"date":"string","taken":"number"\}],"end_time":"string","start_time":"string","time_off_category_id":"integer","timeoff_id":"integer","type":"string"\}]' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
user_idintegertrueUser ID

Body​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
daily_breakdownArray of objectDailyBreakdown replaces the entry's day-by-day count, with the same rules as on create. Omit it to keep the stored one, which must then still fall within the new dates.
end_timestringEndTime is the RFC3339 timestamp the time off period ends at; must be after StartTime. Send it in UTC: offsets are discarded, not converted.
start_timestringStartTime is the RFC3339 timestamp the time off period starts at. Send it in UTC: offsets are discarded, not converted.
time_off_category_idintegerTimeOffCategoryID is the id of an organization time-off policy (category). It must belong to the organization; omit to keep the entry's stored policy.
timeoff_idintegerID is the unique identifier of the time off entry to update.
typestringType is the optional legacy type enum: vacation, sick, parental or other. Omitting it clears the stored type; TimeOffCategoryID is unaffected. Valid values: vacation, sick, parental, other.
daily_breakdown​
NameTypeDescription
datestringDate is the day, as an RFC3339 timestamp at 00:00 UTC.
takennumberTaken is the part of the day taken, from 0 to 1: 1 for a full day, 0.5 for a half day, 0 for a weekend or holiday.

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
created_atstringCreatedAt is the RFC3339 timestamp (UTC) the entry was created at.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count. Omitted when the entry has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown. Omitted when zero.
emojistringEmoji is the emoji of the entry's time-off policy (category). Omitted from create and update responses and for an entry without a policy.
end_timestringEndTime is the RFC3339 timestamp (UTC) the time off period ends at; always after StartTime.
organization_idintegerOrganizationID is the organization the entry belongs to.
policy_namestringPolicyName is the name of the entry's time-off policy (category). Omitted from create and update responses and for an entry without a policy.
start_timestringStartTime is the RFC3339 timestamp (UTC) the time off period starts at.
statusstringStatus is the approval state of the entry: pending, approved, rejected or canceled.
time_off_category_idintegerTimeOffCategoryID is the id of the entry's time-off policy (category). Omitted when the entry has no policy.
timeoff_idintegerID is the unique identifier of the time off entry.
typestringType is the legacy type enum: vacation, sick, parental or other. Independent of TimeOffCategoryID; omitted when unset.
updated_atstringUpdatedAt is the RFC3339 timestamp (UTC) the entry was last modified at.
user_idintegerUserID is the user the time off was booked for.
daily_breakdown​
NameTypeDescription
datestringDate is the day, as an RFC3339 timestamp at 00:00 UTC.
takennumberTaken is the part of the day taken, from 0 to 1: 1 for a full day, 0.5 for a half day, 0 for a weekend or holiday.

400​

Invalid parameters

403​

Forbidden

409​

Overlapping time off entry

500​

Internal Server Error

POST Create time off for the specified user​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}

Creates one or more time off entries for the specified user in a single call. The request body is an array: each element needs a start_time and an end_time (RFC3339) and may carry a policy (time_off_category_id), a daily_breakdown and a legacy type. The sum of daily_breakdown is the entry's day count, charged to the user's balance in its policy and counted in the absence report; an entry without a breakdown counts 0 days. All elements are created in a single transaction: a period that overlaps one of the user's approved or pending time off entries — or another element of the same request — fails the whole request with a 409 and nothing is created (entries created through this API are approved). Requires the manage_time_off organization permission. Responds 200 with the created entries, each including the id it was assigned.

curl -X POST https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id} \
-H "Content-Type: application/json" \
-d '[\{"daily_breakdown":[\{"date":"string","taken":"number"\}],"end_time":"string","start_time":"string","time_off_category_id":"integer","type":"string"\}]' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
user_idintegertrueUser ID

Body​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count: each date within the entry, at most once. Its sum is the entry's day count, charged to the member's balance when the entry has a policy. Omit it and the entry counts 0 days.
end_timestringEndTime is the RFC3339 timestamp the time off period ends at; must be after StartTime. Send it in UTC: offsets are discarded, not converted.
start_timestringStartTime is the RFC3339 timestamp the time off period starts at. Send it in UTC: offsets are discarded, not converted.
time_off_category_idintegerTimeOffCategoryID is the id of an organization time-off policy (category) to attach. It must belong to the organization; omit to leave the entry without a policy.
typestringType is the optional legacy type enum: vacation, sick, parental or other. Independent of TimeOffCategoryID. Valid values: vacation, sick, parental, other.
daily_breakdown​
NameTypeDescription
datestringDate is the day, as an RFC3339 timestamp at 00:00 UTC.
takennumberTaken is the part of the day taken, from 0 to 1: 1 for a full day, 0.5 for a half day, 0 for a weekend or holiday.

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
created_atstringCreatedAt is the RFC3339 timestamp (UTC) the entry was created at.
daily_breakdownArray of objectDailyBreakdown is the entry's day-by-day count. Omitted when the entry has none.
days_takennumberDaysTaken is the entry's day count, the sum of DailyBreakdown. Omitted when zero.
emojistringEmoji is the emoji of the entry's time-off policy (category). Omitted from create and update responses and for an entry without a policy.
end_timestringEndTime is the RFC3339 timestamp (UTC) the time off period ends at; always after StartTime.
organization_idintegerOrganizationID is the organization the entry belongs to.
policy_namestringPolicyName is the name of the entry's time-off policy (category). Omitted from create and update responses and for an entry without a policy.
start_timestringStartTime is the RFC3339 timestamp (UTC) the time off period starts at.
statusstringStatus is the approval state of the entry: pending, approved, rejected or canceled.
time_off_category_idintegerTimeOffCategoryID is the id of the entry's time-off policy (category). Omitted when the entry has no policy.
timeoff_idintegerID is the unique identifier of the time off entry.
typestringType is the legacy type enum: vacation, sick, parental or other. Independent of TimeOffCategoryID; omitted when unset.
updated_atstringUpdatedAt is the RFC3339 timestamp (UTC) the entry was last modified at.
user_idintegerUserID is the user the time off was booked for.
daily_breakdown​
NameTypeDescription
datestringDate is the day, as an RFC3339 timestamp at 00:00 UTC.
takennumberTaken is the part of the day taken, from 0 to 1: 1 for a full day, 0.5 for a half day, 0 for a weekend or holiday.

400​

Invalid parameters

403​

Forbidden

409​

Overlapping time off entry

500​

Internal Server Error

DELETE Delete time off for the specified user​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}

Deletes one or more time off entries of the specified user. The request body is an array of time off ids. Ids that do not match an entry of the user are skipped silently — the response does not indicate how many entries were deleted. Requires the manage_time_off organization permission. Responds 204 with no body.

curl -X DELETE https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id} \
-H "Content-Type: application/json" \
-d '[\{\}]' \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
user_idintegertrueUser ID

Body​

NameTypeDescription
itemsArray of integer-

Response​

204​

No Content

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET Get a user's time off balances​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}/balances

Returns the user's balance as of date, today when omitted, in each active policy that has balance changes; unlimited policies usually have none and are then absent. Requires view_time_off_balance or manage_time_off_balance. A member reads only their own balances, a team lead their team's, and a caller with organization-wide view_time_off anyone's.

curl  https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}/balances \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
user_idintegertrueUser ID

Query​

nametyperequireddescription
category_idintegerfalseOnly this policy
datestringfalseAs-of date (YYYY-MM-DD)

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
balancenumberBalance is the sum of the as-of year's changes up to the as-of date, in days.
carried_overnumberCarriedOver is the sum of changes before the as-of year, in days. It does not expire.
schedulednumberScheduled is the days booked after the as-of date. Not yet subtracted from Balance.
takennumberTaken is the days used in the as-of year up to the as-of date. Already subtracted from Balance.
time_off_category_idintegerTimeOffCategoryID is the policy.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET List a user's time off balance changes​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}/balances/changes

Returns a page of the user's balance changes in one policy that are already in effect, newest first. Access follows the balances endpoint.

curl  https://focus.toggl.com/api/organizations/{organization_id}/timeoff/users/{user_id}/balances/changes \
-H "Content-Type: application/json" \
-u <email>:<password>

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID
user_idintegertrueUser ID

Query​

nametyperequireddescription
category_idintegertruePolicy ID
yearintegerfalseOnly this accrual year
pageintegerfalsePage number, from 1
rowsintegerfalsePage size, 1 to 500 (default 50)

Response​

200​

NameTypeDescription
dataArray of objectData is the page's changes.
pageintegerPage is the 1-based page number.
rowsintegerRows is the page size.
totalintegerTotal is the number of changes across all pages; omitted when zero.
data​
NameTypeDescription
accrual_monthintegerAccrualMonth is the month of a monthly accrual; omitted otherwise.
accrual_yearintegerAccrualYear is the year the change counts toward.
amountnumberAmount is the signed change in days.
created_atstringCreatedAt is when the change was recorded.
created_byintegerCreatedBy is the account id of the member who made the change; omitted for automatic changes.
effective_datestringEffectiveDate is the day the change takes effect.
idintegerID is the change's id.
notestringNote is the note recorded with the change; empty on used changes.
remaining_balancenumberRemainingBalance is the policy balance after this change.
time_off_category_idintegerTimeOffCategoryID is the policy.
time_off_end_datestringTimeOffEndDate is the end of the entry that used the days; set on used changes only.
time_off_idintegerTimeOffID is the entry that used the days; set on used changes only.
time_off_start_datestringTimeOffStartDate is the start of the entry that used the days; set on used changes only.
typestringType is earned (accrual), used (by an entry), adjustment (manual), initial_seed (starting balance) or carry_over (days above MaxCarryOverAmount removed at the new year). Valid values: earned, used, adjustment, initial_seed, carry_over.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

GET List who's out​

https://focus.toggl.com/api/organizations/{organization_id}/timeoff/whos-out

Returns every active member's pending and approved time off overlapping start_date to end_date, both included, at most 7 days. Open to any member of the organization.

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

Parameters​

Path​

nametyperequireddescription
organization_idintegertrueOrganization ID

Query​

nametyperequireddescription
start_datestringtrueWindow start (YYYY-MM-DD)
end_datestringtrueWindow end (YYYY-MM-DD)

Response​

200​

NameTypeDescription
itemsArray of object-
items​
NameTypeDescription
display_namestringDisplayName is the member's name.
end_datestringEndDate is the absence's last day: YYYY-MM-DD.
idintegerID is the entry's id.
start_datestringStartDate is the absence's first day: YYYY-MM-DD.
user_account_idintegerUserAccountID is the absent member.

400​

Invalid parameters

403​

Forbidden

500​

Internal Server Error

© 2026 Toggl. All rights reserved.