openapi: 3.0.0 info: title: TimeCamp API version: '1.0' contact: email: support@timecamp.com termsOfService: https://www.timecamp.com/terms-conditions/ description: | Documentation for the TimeCamp system. Get your API token here: https://app.timecamp.com/app#/settings/users/me Be aware that you can reach API calls limit. Once you do you will get HTTP code 429 response. Request example: ``` GET https://app.timecamp.com/third_party/api/user?user_id=1234567 Headers: Authorization: Bearer 87c21299960a88888888fe123 Accept: application/json ``` servers: - url: https://app.timecamp.com/third_party/api description: PRODUCTION - url: https://v4.api.timecamp.com description: PRODUCTION tags: - name: '[v1] User' x-displayName: User - name: '[v1] Entry' x-displayName: Entry - name: '[v1] Tags' x-displayName: Tags - name: '[v1] Group' x-displayName: Group - name: '[v1] Approvals' x-displayName: Approvals - name: '[v1] Computer Activities' x-displayName: Computer Activities - name: '[v1] Timer' x-displayName: Timer - name: '[v1] Task' x-displayName: Task - name: '[v1] Attendance' x-displayName: Attendance - name: '[v1] Roles & Permissions' x-displayName: Roles & Permissions - name: '[v1] Billing Rates' x-displayName: Billing Rates - name: '[v1] Userlog' x-displayName: Userlog - name: '[v1] Activity alert' x-displayName: Activity alert - name: '[v3] Timer' x-displayName: Timer - name: '[v3] Invoices' x-displayName: Invoices - name: '[v3] Computer Activities' x-displayName: Computer Activities - name: '[v3] Time Entry' x-displayName: Time Entry - name: '[v3] Time Entry Restriction' x-displayName: Time Entry Restriction - name: '[v3] Task Archive' x-displayName: Task Archive - name: '[v3] Expense' x-displayName: Expense - name: '[v3] Plan' x-displayName: Plan - name: '[v3] Storage' x-displayName: Storage - name: '[v3] Module' x-displayName: Module - name: '[v3] Marketplace' x-displayName: Marketplace - name: '[v3] Remote work detection' x-displayName: Remote work detection - name: '[v3] Data Export' x-displayName: Data Export - name: '[v3] Custom Fields' x-displayName: Custom Fields - name: '[v3] Approval' x-displayName: Approval - name: '[v3] Groups Stats' x-displayName: Groups Stats - name: '[v3] Location' x-displayName: Location - name: '[v3] Task Picker' x-displayName: TaskPicker - name: '[v3] Task' x-displayName: Task - name: '[v3] Tags' x-displayName: Tags - name: '[v3] Projects' x-displayName: Projects - name: '[v3] Pivot' x-displayName: Pivot - name: '[v3] Attendance' x-displayName: Attendance - name: '[v3] Attendance Requests' x-displayName: Attendance Requests paths: /timer_running: get: summary: Get information about running timer tags: - '[v1] Timer' responses: '200': description: OK content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: timer_id: oneOf: - type: string - type: number minLength: 1 user_id: oneOf: - type: string - type: number minLength: 1 task_id: oneOf: - type: number - type: string nullable: true started_at: type: string minLength: 1 name: type: string nullable: true required: - timer_id - user_id - started_at examples: info about running timer with no task: value: - timer_id: '18' user_id: '123' task_id: null started_at: '2021-03-05 14:52:06' name: null operationId: get-timer_running description: Returns information about running timer. security: - api_key_in_header: [] /entries_merge: post: operationId: post--entries_merge description: Merge two time entries into one. tags: - '[v1] Entry' summary: Merge time entries requestBody: content: application/json: schema: type: object properties: id: type: string description: 'first entry id to merge ' to_id: type: string description: second entry id to merge responses: '200': description: OK content: application/json: schema: description: '' type: object properties: entry_id: oneOf: - type: string - type: integer user_id: oneOf: - type: string - type: integer minLength: 1 date: type: string minLength: 1 task_id: oneOf: - type: string - type: integer minLength: 1 time_span: type: number locked: oneOf: - type: string - type: integer minLength: 1 last_modify: type: string minLength: 1 note: type: string start_time_hour: type: string minLength: 1 end_time_hour: type: string minLength: 1 invoiceId: oneOf: - type: string - type: integer minLength: 1 billable: oneOf: - type: string - type: integer minLength: 1 examples: merged two entries: value: entry_id: 105445325 user_id: '5252' date: '2020-02-02' task_id: '0' time_span: 4857 locked: '0' last_modify: '2021-03-10 09:08:30' note: '' start_time_hour: '13:05:47' end_time_hour: '14:24:41' invoiceId: '0' billable: '0' '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: approval blocked: value: message: You can't edit time entry, because it is in approved or pending timesheet approval. '404': description: Not Found content: application/json: schema: type: object properties: message: type: string examples: entry not found: value: message: Entry not found '406': description: Not Acceptable content: application/json: schema: type: object properties: message: type: string examples: provided same entries: value: message: You must provide different entries different users: value: message: Both entries must belong to the same user security: - api_key_in_header: [] /entries_changes: get: operationId: get--entries_changes description: Get time enties changes. responses: '200': description: If task or tasks are not found then empty array is returned with 200 code. content: application/json: schema: type: array items: {} examples: empty: value: [] ok response: value: - old_time_span: 0 new_time_span: '0' event_type: add edited: '2020-02-10 05:05:05' entry_id: '104950298' duration: '0' user_id: '5343' description: '' task_id: '77438101' date: '2021-02-10' start_time: '13:04:00' end_time: '13:04:00' locked: '0' billable: 1 invoiceId: '0' '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: dates not provided: value: message: 'you must provide "from" and "to" date like 2013-03-20 ' '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted: value: message: you do not have permissions to get task with id {taskId} (you can set yourself as Time Tracking Administrator or Project Manager) tags: - '[v1] Entry' summary: Get time entries changes parameters: - schema: type: string example: 12,13,32 in: query name: task_ids description: entry task id or ids - schema: type: string example: 45,55,64 in: query name: user_ids description: entry user id or ids - schema: type: integer in: query name: limit description: number of results to get, if empty then get all of them - schema: type: string example: '2020-02-02' in: query name: from description: date in `YYYY-MM-DD` format - schema: type: string example: '2020-02-02' in: query name: to description: date in `YYYY-MM-DD` format security: - api_key_in_header: [] /entries_deletions: get: operationId: get--entries_deletions description: Get time enties deletions. responses: '200': description: If task or tasks are not found then empty array is returned with 200 code. content: application/json: schema: type: array items: {} examples: empty: value: [] ok response: value: - old_time_span: 0 new_time_span: '0' event_type: add edited: '2020-02-10 05:05:05' entry_id: '104950298' duration: '0' user_id: '5343' description: '' task_id: '77438101' date: '2021-02-10' start_time: '13:04:00' end_time: '13:04:00' locked: '0' billable: 1 invoiceId: '0' '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: dates not provided: value: message: 'you must provide "from" and "to" date like 2013-03-20 ' '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted: value: message: you do not have permissions to get task with id {taskId} (you can set yourself as Time Tracking Administrator or Project Manager) tags: - '[v1] Entry' summary: Get time entries deletions parameters: - schema: type: string example: 12,13,32 in: query name: task_ids description: entry task id or ids - schema: type: string example: 45,55,64 in: query name: user_ids description: entry user id or ids - schema: type: integer in: query name: limit description: number of results to get, if empty then get all of them - schema: type: string example: '2020-02-02' in: query name: from description: date in `YYYY-MM-DD` format - schema: type: string example: '2020-02-02' in: query name: to description: date in `YYYY-MM-DD` format security: - api_key_in_header: [] parameters: [] /group: get: operationId: get--group description: Get all groups. responses: '200': description: OK - Array of groups content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: group_id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 parent_id: oneOf: - type: string - type: integer minLength: 1 required: - group_id - name - parent_id examples: example response: value: - group_id: '530222' name: People parent_id: '0' - group_id: '1764' name: '[Inactive]' parent_id: '1208' tags: - '[v1] Group' summary: Get all groups security: - api_key_in_header: [] post: operationId: post--group description: |- Modify existing group. Edit permission is required. WARNING: backend might not return a response, but changes will be applied! responses: '200': description: OK - returns empty response. '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string examples: group fields not provided: value: message: 'You must send valid group fields to change: name, parent_id' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: group id not provided or you are not permitted: value: message: You can not change this group tags: - '[v1] Group' requestBody: content: application/json: schema: description: '' type: object properties: group_id: oneOf: - type: string - type: integer description: group id to modify example: 421 name: type: string description: group name to set example: NewName parent_id: type: string description: parent_id to set example: '11' required: - group_id examples: change group name: value: group_id: 390672 name: NewName summary: Update group security: - api_key_in_header: [] delete: operationId: delete--group description: |- Delete a group. Edit permission is required. Root Group (`parent_id == 0`) cannot be deleted. All subgroups of deleted group have their `parent_id` changed to `root_group_id`. WARNING: backend might not return a response, but changes will be applied! tags: - '[v1] Group' responses: '200': description: OK - empty response is returned. '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted to delete this group: value: message: You can not remove this group requestBody: content: application/json: schema: description: '' type: object properties: group_id: type: number description: group id to delete example: 390673 required: - group_id examples: example: value: group_id: 390673 summary: Delete group security: - api_key_in_header: [] put: operationId: put--group description: |- Add new group. Edit permission is required. There cannot be more than one root group (with parent_id = 0). Maximum group tree depth is 4 levels. If you get an error 403 `You can not change this group` try to wait about one minute and retry. tags: - '[v1] Group' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: group_id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 admin_id: oneOf: - type: string - type: integer minLength: 1 parent_id: oneOf: - type: string - type: integer minLength: 1 root_group_id: oneOf: - type: string - type: integer minLength: 1 examples: created group: value: group_id: '390673' name: Name of New Group admin_id: '0' parent_id: '390672' root_group_id: '390672' '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted to create group: value: message: You can not change this group '404': description: Not Found content: application/json: schema: type: object properties: message: type: string examples: create group too far: value: message: You can create groups only up to level 4 requestBody: content: application/json: schema: description: '' type: object properties: parent_id: oneOf: - type: string - type: integer description: group parent id example: 421 name: type: string description: group name example: NewName required: - name examples: create group: value: parent_id: 390672 name: Name of New Group create root group: value: parent_id: 0 name: Name of New Root Group summary: Create group security: - api_key_in_header: [] /group/{group_id}/setting: get: operationId: get--group-setting description: Returns setting for given group_id. responses: '200': description: OK content: application/json: schema: description: '' type: object properties: groupId: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 value: type: string minLength: 1 inherited: type: boolean inheritedFromGroup: type: integer examples: companyAddress setting: value: groupId: '521' name: companyAddress value: |- Some Street 24 51-521 City, Country VAT EU: PL1231231212 inherited: true inheritedFromGroup: 0 '404': description: Not Found - returns empty array when setting not found. content: application/json: schema: type: array items: {} examples: Example: value: [] tags: - '[v1] Group' summary: Get group setting parameters: - schema: type: string example: companyAddress in: query name: name description: name of setting to get required: true security: - api_key_in_header: [] put: operationId: put--group-setting description: Update group setting. tags: - '[v1] Group' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: groupId: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 value: type: string minLength: 1 inherited: type: boolean inheritedFromGroup: type: integer examples: changed company address: value: groupId: '521' name: companyAddress value: Some...new...adress inherited: true inheritedFromGroup: 0 '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: cannot change this setting: value: message: Setting [setting_name] cannot be changed your plan limits you: value: message: You can't use this feature due to your plan. summary: Update group setting requestBody: content: application/json: schema: description: '' type: object properties: name: type: string description: name of setting to be updated example: companyAddress value: oneOf: - type: string - type: integer description: new value example: NewAddress required: - name - value examples: change companyAddress: value: name: companyAddress value: Some...new...adress description: '' security: - api_key_in_header: [] delete: operationId: delete--group-setting description: Delete group setting. tags: - '[v1] Group' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: groupId: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 value: type: string minLength: 1 inherited: type: boolean inheritedFromGroup: type: integer examples: deleted company address: value: groupId: '552' name: companyAddress value: '' inherited: true inheritedFromGroup: 0 '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: cannot delete setting or not permitted: value: message: Setting [setting_name] cannot be changed summary: Delete group setting requestBody: content: application/json: schema: type: object properties: name: type: string description: name of setting to be deleted example: companyAddress required: - name examples: delete company address: value: name: companyAddress security: - api_key_in_header: [] parameters: - in: path name: group_id schema: type: integer description: group id required: true /group/{group_id}/user: summary: Manage users in a group get: operationId: get--group-user description: Get users from given group. responses: '200': description: OK content: application/json: schema: type: array description: '' uniqueItems: true items: type: object properties: group_id: oneOf: - type: string - type: integer minLength: 1 user_id: oneOf: - type: string - type: integer minLength: 1 activated: oneOf: - type: string - type: integer minLength: 1 role_id: oneOf: - type: string - type: integer minLength: 1 id: oneOf: - type: string - type: integer minLength: 1 email: type: string minLength: 1 pass_hash: type: string minLength: 1 synch_time: type: string minLength: 1 login_time: type: string minLength: 1 register_time: type: string minLength: 1 time_zone: oneOf: - type: string - type: integer minLength: 1 start_of_the_week: oneOf: - type: string - type: integer minLength: 1 display_name: type: string minLength: 1 activation_code: type: string forgotten_password_code: type: string minLength: 1 os_username: type: string operating_system: type: string minLength: 1 login_count: type: string minLength: 1 plan: oneOf: - type: string - type: integer minLength: 1 language: oneOf: - type: string - type: integer minLength: 1 admin_pass: type: string nullable: true admin_userid: type: string nullable: true root_group_id: oneOf: - type: string - type: integer minLength: 1 last_session_id: oneOf: - type: string - type: integer nullable: true already: oneOf: - type: string - type: integer minLength: 1 additional_email: type: string examples: returned users: value: - group_id: '111' user_id: '23' activated: '1' role_id: '1' id: '23' email: john@smith.com pass_hash: gx97b8z7f98as789dfasd synch_time: '2021-03-18 12:47:10' login_time: '2021-03-17 07:59:02' register_time: '2009-03-25 11:35:52' time_zone: '0' start_of_the_week: '0' display_name: John Smith activation_code: '' forgotten_password_code: XXXyyyy333 os_username: '' operating_system: chrome-plugin login_count: '22352' plan: '100' language: '0' admin_pass: null admin_userid: null root_group_id: '111' last_session_id: null already: '1' additional_email: '' - group_id: '111' user_id: '32' activated: '1' role_id: '1' id: '32' email: margaret@smith.com pass_hash: xxx87sgf8g6as6896g89sa98 synch_time: '2021-03-15 14:26:19' login_time: '2021-03-15 11:41:14' register_time: '2018-07-04 08:39:25' time_zone: '0' start_of_the_week: '0' display_name: Margaret Smith activation_code: null forgotten_password_code: '' os_username: DESKTOP-NGFIM9L\msmith operating_system: Windows 10 (build 19041), 64-bit edition login_count: '1885' plan: '0' language: '1' admin_pass: 88978fgs98a798s7adasxzbv admin_userid: '23' root_group_id: '111' last_session_id: null already: '1' '404': description: Not Found content: application/json: schema: type: array items: {} examples: group not found: value: [] tags: - '[v1] Group' summary: Get users in group security: - api_key_in_header: [] post: operationId: post--group-user description: Invite user to a group. tags: - '[v1] Group' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: statuses: type: object properties: '[invited_email]': type: object properties: status: type: string minLength: 1 examples: invited and send email: value: statuses: some@emal.com: status: Invite invited without email: value: statuses: some@email.com: status: Add to group invited two users: value: statuses: some@email.com: status: Add to group another@email.com: status: Add to group '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: invalid email or not provided any: value: message: 'invalid email ' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: not permitted to invite: value: message: You cannot invite people to this group requestBody: required: true content: application/json: schema: type: object properties: tt_global_admin: type: integer description: set invited users as time tracking administrators enum: - 0 - 1 email: type: array description: emails to invite items: type: string dry_run: type: integer enum: - 0 - 1 default: 0 description: used to simulate invite ie. check for errors in request, because it does not really invite user can_view_rates: type: integer description: can invited users view rates enum: - 0 - 1 tt_can_create_level_1_tasks: type: integer description: can invited users create tasks at root level enum: - 0 - 1 add_to_all_projects: type: integer description: adds invited users to all existing tasks enum: - 0 - 1 projects: type: array description: array of tasks ids to add invited users to items: type: integer guests: type: array items: type: object properties: guest: type: boolean description: is this user guest email: type: string description: guest email send_mail: type: integer enum: - 0 - 1 description: should send invitation email default: 1 required: - email encoding: tt_global_admin: style: form explode: true email: style: form explode: true examples: invite two users without sending email: value: email: - some@email.com - another@email.com send_email: 0 add two guests: value: email: - some@email.com - another@email.com guests: - guest: 1 email: some@email.com - guest: 1 email: another@email.com description: If `tt_global_admin` is set to `1` then fields `tt_can_create_level_1_tasks` and `can_view_rates` are set to `1` too - this behavior is unchangeable. parameters: [] summary: Invite user to a group security: - api_key_in_header: [] delete: operationId: delete--group-user description: Delete user from group. tags: - '[v1] Group' responses: '200': description: Ok content: application/json: schema: description: '' type: object properties: status: type: string minLength: 1 wiped: type: boolean examples: deleted user: value: status: ok wiped: true '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: not permitted: value: message: You cannot remove users from this group user to delete not found: value: message: User with specified ID wasn't found user is not in this group: value: message: User does not belong to this group summary: Delete user from group security: - api_key_in_header: [] put: operationId: put--group-user description: Update user in group or move user to other group. tags: - '[v1] Group' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: user_id: type: array items: type: integer role_id: type: number group_id: type: number examples: changed role to 1: value: user_id: - 1723605 role_id: 1 group_id: 252 moved 2 users to different group: value: user_id: - 51256 - 6362 role_id: 0 group_id: 5526 '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted to this group: value: message: You cannot change roles in this group not permitted to user: value: message: 'You cannot change roles of this user: [user_id]' not permitted to move to this group: value: message: You cannot move people to this group summary: Update user in group requestBody: content: application/json: schema: type: object properties: user_id: oneOf: - type: integer - type: array description: user or users to edit example: 552 items: {} role_id: type: integer description: role id to set for user/users enum: - 1 - administrator - 2 - supervisor - 3 - user - 5 - guest group_id: type: integer description: group id to move user to examples: move users to new group: value: user_id: - 1723605 - 1706128 group_id: 5526 change user role: value: user_id: 1723605 role_id: 1 security: - api_key_in_header: [] parameters: - in: path required: true name: group_id description: group_id schema: type: integer /group/{group_id}/scheduler: get: operationId: get--group-scheduler description: Get group scheduler. responses: '200': description: OK content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: event_id: oneOf: - type: string - type: integer minLength: 1 group_id: oneOf: - type: string - type: integer minLength: 1 start_time: type: string minLength: 1 end_time: type: string minLength: 1 day: type: string minLength: 1 recurring: oneOf: - type: string - type: integer minLength: 1 type: oneOf: - type: string - type: integer minLength: 1 variant: oneOf: - type: string - type: integer minLength: 1 examples: example response: value: - event_id: '674337' group_id: '552' start_time: '11:00:00' end_time: '18:00:00' day: '3' recurring: '1' type: '0' variant: '0' '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted: value: message: You cannot see scheduler in this group tags: - '[v1] Group' summary: Get group scheduler security: - api_key_in_header: [] delete: operationId: delete--group-scheduler description: Delete group scheduler. tags: - '[v1] Group' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: event_id: oneOf: - type: string - type: integer minLength: 1 group_id: oneOf: - type: string - type: integer minLength: 1 start_time: type: string minLength: 1 end_time: type: string minLength: 1 day: oneOf: - type: string - type: integer minLength: 1 recurring: oneOf: - type: string - type: integer minLength: 1 type: oneOf: - type: string - type: integer minLength: 1 variant: oneOf: - type: string - type: integer minLength: 1 examples: example response: value: event_id: '6567457' group_id: '552' start_time: '11:00:00' end_time: '18:00:00' day: '3' recurring: '1' type: '0' variant: '0' '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted: value: message: You cannot edit scheduler in this group summary: Delete group scheduler security: - api_key_in_header: [] put: operationId: put--group-scheduler description: Create or update group scheduler. tags: - '[v1] Group' responses: '201': description: Created - empty response is returned with `Location` header. '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted: value: message: You cannot edit scheduler in this group summary: Create/Update group scheduler requestBody: content: application/json: schema: type: object properties: day: type: integer description: day of scheduler (1 - monday, 7 - sunday) variant: type: integer description: scheduler variant enum: - 0 - 1 start_time: type: string description: scheduler start time in `HH:mm:ss` format example: '08:00:00' end_time: type: string description: scheduler end time in `HH:mm:ss` format example: '15:00:00' examples: create new scheduler: value: day: 3 variant: 0 start_time: '11:11:11' end_time: '12:12:12' update times in scheduler: value: day: 3 variant: 0 start_time: '13:13:13' end_time: '18:18:18' description: If scheduler with given `day` and `variant` is found then this scheduler is updated by fields `day`, `variant`, `start_time` and `end_time`. If the scheduler is not found then new one is created with fields above. security: - api_key_in_header: [] parameters: - in: path required: true name: group_id description: group id schema: type: integer /group/{group_id}/company_logo: get: operationId: get--group-company_logo description: Returns url to group logo. responses: '200': description: OK content: application/json: schema: description: '' type: string examples: returned logo url: value: https://url.to.logo/8b5b7c944368381316c8b3ad574f5a92.png '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: invalid user, not permitted or something went wrong: value: message: Invalid user tags: - '[v1] Group' summary: Get group logo security: - api_key_in_header: [] parameters: - in: path required: true name: group_id schema: type: integer description: group id /users: get: summary: Get all users data tags: - '[v1] User' responses: '200': description: OK content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: group_id: oneOf: - type: string - type: integer minLength: 1 user_id: oneOf: - type: string - type: integer minLength: 1 email: type: string minLength: 1 login_count: oneOf: - type: string - type: integer minLength: 1 login_time: type: string minLength: 1 description: last login time display_name: type: string minLength: 1 synch_time: type: string minLength: 1 description: last desktop app synch time examples: example: value: - group_id: '1234' user_id: '1231456' email: mr@smith.com login_count: '1402' login_time: '2020-12-21 17:15:22' display_name: Agent Smith synch_time: '2020-12-21 17:10:21' - group_id: '1234' user_id: '1235213' email: mrs@smith.com login_count: '22084' login_time: '2021-03-11 10:21:15' display_name: Jan Kowalski synch_time: '2020-12-21 23:29:09' - group_id: '1234' user_id: '5123213' email: some@example.com login_count: '1775' login_time: '2020-12-21 13:43:12' display_name: Example Name synch_time: '2020-12-21 14:00:45' headers: {} operationId: get-users description: Retrieves information about all users in an account parameters: - schema: type: boolean in: query name: active_only description: If true returns only active users security: - api_key_in_header: [] /user/{user_id}/setting: get: operationId: get-user-setting description: Return user's setting value. responses: '200': description: OK content: application/json: schema: description: '' type: object properties: userId: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 value: oneOf: - type: string - type: integer minLength: 1 examples: getting tt_global_admin setting: value: userId: '123' name: tt_global_admin value: '1' '404': description: Not Found - if provided empty or non-existent setting an empty array is returned. content: application/json: schema: type: array items: {} examples: Example: value: [] tags: - '[v1] User' summary: Get user setting parameters: - schema: type: string in: query name: name description: setting name security: - api_key_in_header: [] parameters: - in: path required: true name: user_id description: user id schema: type: integer put: summary: Update user setting operationId: put-user-user_id-setting responses: '200': description: OK content: application/json: schema: description: '' type: object properties: userId: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 value: oneOf: - type: string - type: integer examples: changed setting value to empty: value: userId: '123' name: tt_long_tracking_reminder value: '' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: bad setting name or cannot change this setting: value: message: Setting ss cannot be changed description: Update user setting. requestBody: content: application/json: schema: type: object properties: name: type: string description: setting name value: oneOf: - type: string - type: integer description: setting value required: - name tags: - '[v1] User' security: - api_key_in_header: [] delete: summary: Delete user setting operationId: delete-user-user_id-setting responses: '200': description: OK content: application/json: schema: description: '' type: object properties: userId: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 value: type: string minLength: 1 examples: deleted setting: value: userId: '552' name: hideChatWidget value: '0' description: Delete user setting. requestBody: content: application/json: schema: type: object properties: name: type: string description: setting name to delete example: hideChatWidget examples: delete setting: value: name: hideChatWidget tags: - '[v1] User' security: - api_key_in_header: [] /tag: post: operationId: post--tag description: Create tag. Do not provide `tag_id` in url, because while creating new tag a new, unique `tag_id` will be made. If you provide `tag_id` in url, a 400 HTTP response is returned. parameters: [] responses: '200': description: OK Response returns newly created tag id. content: application/json: schema: type: integer examples: created tag: value: 16 '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: tag_id provided in url: value: message: Bad request. tag list does not exists: value: message: Tag list does not exist. name not provided: value: message: You can't create new tag list. Name is empty. tags: - '[v1] Tags' requestBody: content: application/json: schema: type: object properties: list: oneOf: - type: string - type: integer description: tag list id - to this list a newly created tag will be added example: 52 name: type: string description: tag name example: Development required: - list - name summary: Create tag security: - api_key_in_header: [] /tag/{tag_id}: get: summary: Get tag data operationId: get-tag responses: '200': description: OK response content: application/json: schema: description: '' type: object properties: id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 tagListId: oneOf: - type: string - type: integer minLength: 1 hasGroupRestrictions: oneOf: - type: string - type: integer minLength: 1 examples: returned tag info: value: id: '13' name: '111' archived: '0' tagListId: '8' hasGroupRestrictions: '0' '400': description: Bad Request is returned when tag_id is not provided or tag does not exist. content: application/json: schema: type: object properties: message: type: string examples: tag id no provided: value: message: Bad request. tag doesnt exist: value: message: Tag does not exist. description: Get tag data. parameters: - in: path required: true name: tag_id description: tag id schema: type: integer tags: - '[v1] Tags' security: - api_key_in_header: [] put: summary: Update tag operationId: put-tag-tag_id parameters: - in: path required: true name: tag_id description: tag id schema: type: integer responses: '200': description: OK - tag updated content: application/json: schema: type: object properties: message: type: string examples: updated tag data: value: message: OK '201': description: Created '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: tag id not provided: value: message: Bad request. tag not found: value: message: Tag with id 123 not found '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: tag is in active integration: value: message: You cannot edit tag from active integration description: Modify tag data. requestBody: content: application/json: schema: type: object properties: name: type: string description: new tag name archived: oneOf: - type: string - type: integer description: set if tag is archived tags: - '[v1] Tags' security: - api_key_in_header: [] parameters: [] /tag/{tag_id}/groups: get: operationId: get--tag-groups description: |- Get tag allowed groups Returns tags available in a group responses: '200': description: OK Response content: application/json: schema: description: '' type: object properties: '': type: object required: - id - name - hasSubgroups properties: id: type: string minLength: 1 name: type: string minLength: 1 hasSubgroups: type: string minLength: 1 required: - '' examples: returned data: value: '5525': id: '5525' name: TimeCamp / Development hasSubgroups: '0' '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: tag does not exist: value: message: Tag does not exist. tags: - '[v1] Tags' summary: Get tag allowed groups security: - api_key_in_header: [] parameters: - in: path required: true name: tag_id description: tag id schema: type: integer /tag/{tag_id}/group/{group_id}: post: operationId: post--tag-group description: Add allowed group to tag. Do not provide `group_id` in url. responses: '200': description: OK Response content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: added allowed gropu to tag: value: message: OK '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: example: value: message: Bad request. tags: - '[v1] Tags' summary: Add allowed group to tag requestBody: content: application/json: schema: type: object properties: group: oneOf: - type: string - type: integer description: group id which will be allowed to use given tag security: - api_key_in_header: [] delete: operationId: delete--tag-group description: Delete allowed group from tag. responses: '200': description: OK Response content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: deleted group from tag: value: message: OK '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: wrong parameters: value: message: Bad request. delete fails: value: message: Delete fails tags: - '[v1] Tags' summary: Delete allowed group from tag security: - api_key_in_header: [] parameters: - in: path required: true name: tag_id description: tag id schema: type: integer - schema: type: integer name: group_id in: path required: true description: group id to delete (only for DELETE option) /tag_list: get: operationId: get--tag_list- description: Get tag list data. responses: '200': description: OK Response - returns array of tag lists. content: application/json: schema: description: '' type: object properties: '[id]': type: object properties: id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 examples: Example: value: '3': id: '3' name: Tags 1 archived: '0' '4': id: '4' name: Tags 2 archived: '0' '5': id: '5' name: Tags 3 archived: '0' '8': id: '8' name: Other tag list archived: '0' tags: - '[v1] Tags' summary: Get tag list parameters: - schema: type: integer example: 523 in: query name: task_id description: get tag list data from task - schema: type: integer enum: - 0 - 1 in: query name: archived description: include archived tag lists - schema: type: integer enum: - 0 - 1 in: query name: tags description: include tags - schema: type: integer enum: - 0 - 1 in: query name: exclude_empty_tag_lists description: include empty tag lists - schema: type: integer enum: - 0 - 1 in: query name: use_restrictions description: get group tag list -> default option (1) or root group tag lists (0) security: - api_key_in_header: [] post: operationId: post--tag_list- description: Create new tag list. responses: '200': description: OK Response - returns tag list id content: application/json: schema: oneOf: - type: string - type: integer examples: created new tag list: value: 15 '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: name not provided: value: message: You can't create new tag list. Name is empty. tags: - '[v1] Tags' summary: Create new tag list requestBody: content: application/json: schema: type: object properties: name: type: string description: tag list name example: tag list description: '' security: - api_key_in_header: [] /tag_list/{tag_list_id}: get: operationId: get--tag_list description: Get tag list tags. responses: '200': description: OK Response, `tags` is an array of tags included in tag list. content: application/json: schema: description: '' type: object properties: id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 tags: type: object properties: '': type: object properties: id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 hasGroupRestrictions: oneOf: - type: string - type: integer minLength: 1 examples: Example response: value: id: '8' name: My tag list archived: '0' tags: '13': id: '13' name: First tag archived: '0' hasGroupRestrictions: '0' '14': id: '14' name: Second Tag archived: '0' hasGroupRestrictions: '0' '15': id: '15' name: Third Tag archived: '0' hasGroupRestrictions: '0' '16': id: '16' name: Fourth Tag archived: '0' hasGroupRestrictions: '0' Tag list not found: value: [] tags: - '[v1] Tags' summary: Get tag list with tags security: - api_key_in_header: [] put: operationId: put--tag_list description: Update tag list data. tags: - '[v1] Tags' responses: '200': description: OK Response content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: updated tag list: value: message: OK '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: tag list not found: value: message: Tag list does not exist. summary: Update tag list data requestBody: content: application/json: schema: type: object properties: name: type: string description: Newer Tag list example: New tag list name archived: type: integer description: set archived status enum: - 0 - 1 description: '' security: - api_key_in_header: [] parameters: - in: path required: true name: tag_list_id description: tag list id schema: type: integer /tag_list/{tag_list_id}/tags: get: operationId: get--tag_list-tags description: | Get tags from a specific tag list. responses: '200': description: OK Response content: application/json: schema: description: '' type: object properties: '': type: object properties: id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 hasGroupRestrictions: oneOf: - type: string - type: integer minLength: 1 examples: Returned tags: value: '13': id: '13' name: First tag archived: '0' hasGroupRestrictions: '0' '14': id: '14' name: Second Tag archived: '0' hasGroupRestrictions: '0' '15': id: '15' name: Third tag archived: '0' hasGroupRestrictions: '0' '16': id: '16' name: Fourth Tag archived: '0' hasGroupRestrictions: '0' Tag list not found: value: [] tags: - '[v1] Tags' summary: Get only tags of a tag list security: - api_key_in_header: [] parameters: - schema: type: integer name: tag_list_id in: path required: true description: tag list id /entries: get: operationId: get--entries description: |- Get time entry or entries. If both `modify_from` and `modify_to` parameters are provided, `from` and `to` are not required. responses: '200': description: OK response content: application/json: schema: description: '' type: object properties: id: type: integer description: time entry id duration: type: string minLength: 1 description: time entry duration user_id: type: string minLength: 1 user_name: type: string minLength: 1 task_id: type: string minLength: 1 description: task connected to this time entry last_modify: type: string minLength: 1 date: type: string minLength: 1 description: time entry date start_time: type: string minLength: 1 description: time entry start time end_time: type: string minLength: 1 description: time entry end time locked: type: string minLength: 1 description: is this time entry locked name: type: string minLength: 1 description: connected task name addons_external_id: type: string billable: type: integer description: is this time entry billable invoiceId: type: string minLength: 1 description: is this time entry invoiced color: type: string minLength: 1 description: time entry color description: type: string minLength: 1 description: time entry note tags: type: array uniqueItems: true minItems: 1 items: type: object properties: tagListName: type: string minLength: 1 tagListId: type: string minLength: 1 tagId: type: string minLength: 1 name: type: string minLength: 1 mandatory: type: string minLength: 1 hasEntryLocationHistory: type: boolean examples: Example: value: id: 77181352 duration: '2700' user_id: '123' user_name: John Kowalski task_id: '51218281' last_modify: '2020-02-02 00:03:50' date: '2020-02-03' start_time: '09:00:00' end_time: '09:45:00' locked: '0' name: Development projects addons_external_id: '' billable: 1 invoiceId: '0' color: '#5DCB73' description: my description tags: - tagListName: tagList tagListId: '8' tagId: '13' name: Dev mandatory: '0' hasEntryLocationHistory: false '403': description: When given `user_ids` are not found empty response is retured with code 403. 403 is also returned when you don't have sufficient permissions. content: application/json: schema: type: string description: '' example: '[]' examples: {} tags: - '[v1] Entry' summary: Get time entries parameters: - schema: type: boolean enum: - 'true' - 'false' in: query name: billable description: get billable entries - schema: type: string example: '2021-03-01' format: date in: query name: from description: from date in `YYYY-MM-DD` format required: true - schema: type: string example: '2021-03-11' format: date in: query name: to description: to date in `YYYY-MM-DD` format required: true - schema: type: string format: date example: '2022-02-06' in: query name: modify_from description: minimal latest modification date in `YYYY-MM-DD` format - schema: type: string example: '2022-02-12' format: date in: query name: modify_to description: maximal latest modification date in `YYYY-MM-DD` format - schema: type: integer example: '12, if you want multiple tag ids then you need to repeat the query with different id as in: ...?tags_filter[items][][tag]=12&tags_filter[items][][tag]=15' in: query name: tags_filter[items][][tag] description: filter entries with tag id - schema: type: boolean enum: - 'true' - 'false' in: query name: approvalMode description: get only users that user has acl permissions for - schema: type: string enum: - tags - breadcrumps in: query name: opt_fields description: include fields like `tags` or `breadcrumbs` - schema: type: boolean enum: - 'true' - 'false' in: query name: include_project description: include project/task information - schema: type: boolean enum: - 'true' - 'false' in: query name: include_rates description: include rates - schema: type: boolean enum: - 'true' - 'false' in: query name: with_subtasks description: include subtasks - schema: type: boolean enum: - 'true' - 'false' in: query name: ignoreInvoiced description: ignore invoiced entries - schema: type: boolean enum: - 'true' - 'false' in: query name: round_duration description: round entry duration - schema: type: boolean enum: - 'true' - 'false' in: query name: active_only description: return active entries only, only when `with_subtask` = `true` - schema: type: string example: '`me` for your entries or user_ids like `123,5213,1223`' in: query name: user_ids description: get entries of given user ids security: - api_key_in_header: [] delete: operationId: delete--entries description: Delete time entries. tags: - '[v1] Entry' responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string examples: deleted entry: value: message: removed '204': description: No Content content: application/json: schema: type: object properties: message: type: string examples: no such entry: value: message: No such entry '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: entry id not provided: value: message: Missing entry ID '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: approval blocked: value: message: You can't edit time entry, because it is in approved or pending timesheet approval. insufficient permission: value: message: You don't have access to this entry summary: Delete time entry requestBody: content: application/json: schema: type: object properties: id: type: integer description: entry id to delete security: - api_key_in_header: [] post: operationId: post--entries description: Create time entry. tags: - '[v1] Entry' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: entry_id: type: number required: - entry_id examples: created entry: value: entry_id: 1563234 '400': description: Bad request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: Date not provided: value: message: You must provide a date for the time entry Not allowed to edit manually: value: message: It is not allowed to enter projects time manually in timesheet on the website. Administrator can disable this option in Settings. Duration not provided (if `start` and `end` are not provided): value: message: you must provide a duration in seconds for time entry '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: Not permitted if guest: value: message: Sorry, you don’t have permissions to track time as a guest Start time is after end time: value: message: Start time (2021-03-05 09:12:52) can not be after end time (2021-03-05 08:23:10). summary: Create time entry requestBody: content: application/json: schema: type: object properties: get_entries: type: integer enum: - 0 - 1 description: if `true` then this works like `GET` date: type: string description: entry will be created on this date example: '2021-03-02' start: type: string description: entry start time, this has higher priority than `start_time` if provided both example: '2020-02-02 13:05:47' start_time: type: string description: entry start time example: '2020-02-02 13:05:47' end: type: string description: entry end time, this has higher priority than `end_time` if provided both example: '2020-02-02 15:21:31' end_time: type: string description: entry end time example: '2020-02-02 15:21:31' duration: type: integer description: duration in seconds, required if `start` and `end` are not given example: 7200 user_id: oneOf: - type: string - type: integer description: user id for which you create the entry example: 52315 task_id: type: number description: entry task example: 1523 tags: type: array description: array of tags ids to add to entry items: type: object properties: tagId: type: integer example: '"tags": [ {"tagId": 1}, {"tagId": 4} ]' note: type: string description: note for entry, same as `description` description: type: string description: description for entry, same as `note` billable: type: boolean description: is entry billable example: true required: - date security: - api_key_in_header: [] put: operationId: put--entries description: Update time entries. tags: - '[v1] Entry' responses: '200': description: OK response content: application/json: schema: description: '' type: object properties: time_span: type: number description: entry duration entry_id: oneOf: - type: string - type: integer minLength: 1 user_id: oneOf: - type: string - type: integer minLength: 1 date: type: string minLength: 1 task_id: oneOf: - type: string - type: integer minLength: 1 locked: oneOf: - type: string - type: integer minLength: 1 last_modify: type: string minLength: 1 note: type: string start_time_hour: type: string minLength: 1 end_time_hour: type: string minLength: 1 invoiceId: oneOf: - type: string - type: integer minLength: 1 billable: oneOf: - type: string - type: boolean minLength: 1 examples: Changed duration: value: time_span: 1800 entry_id: '10544326' user_id: '425' date: '2020-02-02' task_id: '0' locked: '0' last_modify: '2021-03-10 10:21:40' note: '' start_time_hour: '13:05:47' end_time_hour: '14:24:41' invoiceId: '0' billable: '0' '400': description: some examples of Bad Request responses content: application/json: schema: type: object properties: message: type: string examples: bad date format: value: message: unrecognized {format_name} format vacation limit time exceeded: value: message: Vacation limit time exceeded. '403': description: some examples of Forbidden response content: application/json: schema: type: object properties: message: type: string examples: entry blocked by approval: value: message: You can't edit time entry, because it is in approved or pending timesheet approval. not permitted to edit entry: value: message: You do not have permissions to edit this entry guest not permitted: value: message: Sorry, you don’t have permissions to track time as a guest entry in archived task: value: message: Tracking time for archived tasks is not available. Please select another task. summary: Update time entry requestBody: content: application/json: schema: description: '' type: object properties: id: type: integer description: entry id example: 52321 start_time: type: string description: entry start hour example: '14:03:21' end_time: type: string description: entry end time example: '16:02:15' duration: description: entry duration in seconds type: integer date: type: string description: entry date in `YYYY-MM-DD` format example: '2021-03-06' note: type: string description: note for entry, same as `description` description: type: string description: description for entry, same as `note` invoiceId: type: integer description: entry invoice id task_id: type: integer description: entry task id billable: type: boolean description: is entry billable example: true required: - id description: '' security: - api_key_in_header: [] /activity: get: operationId: get--activity description: Get computer activities. tags: - '[v1] Computer Activities' responses: '200': description: Array of computer activities. content: application/json: schema: description: '' type: object properties: user_id: oneOf: - type: string - type: integer application_id: oneOf: - type: string - type: integer end_time: type: string minLength: 1 time_span: type: integer description: number of seconds window_title_id: oneOf: - type: string - type: integer end_date: type: string minLength: 1 task_id: oneOf: - type: string - type: integer entry_id: oneOf: - type: string - type: integer application: type: string description: Field with application name if DTO was extended with include parameter window_title: type: string description: Field with window title if DTO was extended with include parameter examples: Example: value: - user_id: '123' application_id: '795630' end_time: '2020-02-02 09:30:07' time_span: 9 window_title_id: '26079668' end_date: '2020-02-02' task_id: '0' entry_id: '0' - user_id: '123' application_id: '795630' end_time: '2020-02-02 09:30:11' time_span: 4 window_title_id: '23745620' end_date: '2020-02-02' task_id: '0' entry_id: '0' '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: dates not provided: value: message: 'you must provide "date" like 2013-03-20 ' summary: Get computer activities parameters: - schema: type: string example: 123, 124 in: query name: user_id description: user ids separated by commas - schema: type: string example: '2021-03-02' format: date in: query name: dates[] description: dates (you can provide max 20 dates) required: true - schema: type: string example: application,window_title in: query name: include description: 'Join additional data to result, possible options are: application and window_title' x-internal: false security: - api_key_in_header: [] /entries/{entry_id}/tags: get: operationId: get--entries-tags description: Get tags for a given time entry ID. responses: '200': description: An object with entry ID as key and an array of tag-objects content: application/json: schema: description: '' type: object properties: '101434259': type: array uniqueItems: true minItems: 1 items: type: object properties: tagListName: type: string minLength: 1 tagListId: oneOf: - type: string - type: integer minLength: 1 tagId: oneOf: - type: string - type: integer nullable: true minLength: 1 name: oneOf: - type: string - type: integer nullable: true minLength: 1 mandatory: oneOf: - type: string - type: integer minLength: 1 examples: example response: value: '101434259': - tagListName: Not important tags tagListId: '8' tagId: '13' name: '111' mandatory: '0' tags: - '[v1] Tags' parameters: [] summary: Get time entry tags security: - api_key_in_header: [] put: operationId: put--entries-tags description: Assing tags to time entry or entries. tags: - '[v1] Tags' responses: '200': description: OK response is returned when successfully added tag and when given tag id or tag ids are not found. content: application/json: schema: type: array items: oneOf: - type: string - type: integer examples: successfully added tag to entry: value: - '13' given tags not found: value: [] '400': description: Bad Request content: application/json: schema: type: string examples: no tags provided: value: Empty tags requestBody: content: application/json: schema: type: object properties: tags: type: string description: tag ids to set example: 21 or 21,214,123 if multiple summary: Add tags to time entry security: - api_key_in_header: [] delete: operationId: delete--entries-tags description: Delete tags from time entry. tags: - '[v1] Tags' responses: '200': description: OK response is returned when successfully removed tags from time entry and when given tag id or tag ids are not found. content: application/json: schema: type: array items: oneOf: - type: string - type: integer examples: successfully deleted tag from entry: value: - '15' given tags not found: value: [] '400': description: Bad Request content: application/json: schema: type: string examples: no tags provided: value: Empty tags summary: Delete tags from time entry security: - api_key_in_header: [] parameters: - schema: type: integer example: 52512 name: entry_id in: path required: true description: entry id, possible multiple in GET method ie. `123,124,125` /entries/{entry_id}/tag_lists: parameters: - in: path required: true name: entry_id schema: type: integer example: 213 description: entry id /me: get: operationId: get--me description: Get your user data. responses: '200': description: OK content: application/json: schema: description: '' type: object properties: user_id: oneOf: - type: string - type: integer minLength: 1 email: type: string minLength: 1 register_time: type: string minLength: 1 display_name: type: string nullable: true synch_time: type: string nullable: true root_group_id: oneOf: - type: string - type: integer minLength: 1 permissions: type: object properties: time_tracking_admin: type: boolean create_projects: type: boolean can_view_rates: type: boolean examples: example: value: user_id: '1234123' email: john@smith.com register_time: '2021-03-25 11:35:52' display_name: John Smith synch_time: '2020-12-21 23:29:09' root_group_id: '552' permissions: time_tracking_admin: true create_projects: true can_view_rates: true tags: - '[v1] User' summary: Get your user data security: - api_key_in_header: [] /approval: get: operationId: get--approval description: Get approval or approvals responses: '200': description: OK - even if no approvals match given filters, an empty array is returned content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: id: oneOf: - type: string - type: integer minLength: 1 status: oneOf: - type: string - type: integer minLength: 1 for: oneOf: - type: string - type: integer minLength: 1 by: oneOf: - type: string - type: integer minLength: 1 from: type: string minLength: 1 to: type: string minLength: 1 projects: type: string nullable: true auto: oneOf: - type: string - type: integer minLength: 1 comments: type: string nullable: true attendance: type: object properties: '[date]': type: object properties: should_be: oneOf: - type: string - type: integer minLength: 1 day_type: oneOf: - type: string - type: integer minLength: 1 examples: Response with attendance: value: - id: '87769' status: '0' for: '1234' by: '0' from: '2020-01-01' to: '2020-01-01' projects: null auto: '0' comments: null attendance: '2020-01-01': should_be: '480' day_type: normal tags: - '[v1] Approvals' summary: Get approvals parameters: - schema: type: string example: '2021-03-01' in: query name: from description: date in `YYYY-MM-DD` format - schema: type: string example: '2021-03-05' in: query name: to description: date in `YYYY-MM-DD` format - schema: type: integer enum: - 0 - 1 in: query name: with_attendance description: 'return with attendance, default: 0' security: - api_key_in_header: [] post: operationId: post--approval description: Create new approval or update existing one. tags: - '[v1] Approvals' responses: '201': description: Created content: application/json: schema: description: '' type: object properties: id: oneOf: - type: string - type: integer minLength: 1 approval_id: oneOf: - type: string - type: integer minLength: 1 status: oneOf: - type: string - type: integer minLength: 1 for: oneOf: - type: string - type: integer minLength: 1 by: oneOf: - type: string - type: integer nullable: true from: type: string minLength: 1 to: type: string minLength: 1 projects: type: string minLength: 1 comments: type: array uniqueItems: true minItems: 1 items: type: object properties: approval_comment_id: oneOf: - type: string - type: integer minLength: 1 user_date_time: type: string minLength: 1 user_id: oneOf: - type: string - type: integer minLength: 1 comment: type: string minLength: 1 approval_id: oneOf: - type: string - type: integer minLength: 1 event: oneOf: - type: string - type: integer minLength: 1 examples: created/modified approval: value: id: '176189' approval_id: '176189' status: '0' for: '552' by: null from: '2021-03-18' to: '2021-03-18' projects: '0' comments: - approval_comment_id: '2' user_date_time: '2021-03-02 15:19:07' user_id: '225' comment: comment by approver approval_id: '176189' event: '3' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: not permitted for this user: value: message: you dont have permissions to change timesheet for this user approval does not exist: value: message: there is no timesheet approval with id [id] approvals for this user are disabled: value: message: Timesheet approvals for requested user are disabled summary: Create/Update approval requestBody: content: application/json: schema: type: object properties: from: type: string description: date in `YYYY-MM-DD` format example: '2021-03-04' to: type: string description: date in `YYYY-MM-DD` format example: '2021-03-15' status: type: integer description: approval status enum: - 0 - open - 1 - approved - 2 - pending - 3 - rejected user_id: type: string description: user id which approval is for example: '32' required: - from - to - status - user_id examples: create approved approval: value: user_id: 522 from: '2021-03-17' to: '2021-03-17' status: 1 update approval status: value: approval_id: 176189 user_id: 522 from: '2021-03-18' to: '2021-03-18' status: 3 description: When updating approval you must provide all the fields, otherwise they will be empty. security: - api_key_in_header: [] /attendance: get: operationId: get--attendance description: Get attendance responses: '200': description: OK - even if no attendance match given filters, an empty array is returned content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: user_id: type: string user_name: type: string start_time: type: string end_time: type: string total_time: type: string date: type: string approved: type: boolean examples: example response: value: - user_id: '640' user_name: Test User start_time: '12:38:05' end_time: '17:46:45' total_time: '2717' date: '2021-12-01' - user_id: '1933' user_name: Test User2 start_time: '08:24:31' end_time: '18:10:37' total_time: '27359' date: '2021-12-01' summary: Get attendance parameters: - schema: type: string example: '2021-03-01' in: query name: from description: date in `YYYY-MM-DD` format required: true - schema: type: string example: '2021-03-05' in: query name: to description: date in `YYYY-MM-DD` format required: true - schema: type: string example: 1234,321,4567 in: query name: users description: user Id's separated by coma - schema: type: string example: application/json in: header name: Accept description: Header for json data format security: - api_key_in_header: [] tags: - '[v1] Attendance' parameters: [] /approval_users: get: operationId: get--approval_users description: Returns list with user ids which you are able to either approve or reject. responses: '200': description: 'OK ' content: application/json: schema: description: '' type: object properties: '[user_id]': oneOf: - type: string - type: integer minLength: 1 examples: Example: value: '552525': '552525' '552526': '552526' '552527': '552527' '552528': '552528' '552529': '552529' tags: - '[v1] Approvals' summary: Get approval users security: - api_key_in_header: [] /tasks: get: operationId: get--tasks description: |- Returns information about task or tasks. If asked about specific task (`task_id` or `external_task_id` was provided) and no task was found it returns error status of `404 Not Found`. responses: '200': description: It returns an object of objects keyed with ID of a task in a tree structure. content: application/json: schema: type: object properties: '[task_id]': type: object properties: task_id: type: integer parent_id: type: integer nullable: true assigned_by: type: integer nullable: true name: type: string minLength: 1 external_task_id: type: string nullable: true external_parent_id: type: string nullable: true level: type: integer archived: type: integer tags: type: string deprecated: true nullable: true budgeted: type: integer budget_unit: type: string minLength: 1 root_group_id: type: integer nullable: true billable: type: integer note: type: string nullable: true public_hash: type: string nullable: true add_date: type: string minLength: 1 modify_time: type: string minLength: 1 nullable: true color: type: string minLength: 1 users: type: object properties: '[user_id]': type: object properties: user_id: type: integer role_id: type: integer perms: type: object minProperties: 6 maxProperties: 6 properties: '1': type: integer '2': type: integer '3': type: integer '5': type: integer '6': type: integer '7': type: integer user_access_type: type: integer keywords: type: string nullable: true examples: Example: value: '73479227': task_id: '12312' parent_id: '424244' assigned_by: '1513337' name: task name external_task_id: null external_parent_id: null level: '2' archived: '1' tags: '' keywords: '' budgeted: '0' budget_unit: fee root_group_id: '123' billable: '1' note: null public_hash: null add_date: '2020-07-03 09:14:21' modify_time: '2020-07-03 12:36:10' color: '#4B5A74' users: '5551': user_id: '5551' role_id: '1' '5552': user_id: '5552' role_id: '3' user_access_type: 4 '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string required: - message '404': description: Not Found content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message tags: - '[v1] Task' summary: Get task info parameters: - schema: type: string in: query name: task_id description: asks for specific task with `task_id` that is number, can be multiple tasks separated by , - schema: type: string in: query name: external_task_id description: asks for specific task with `external_task_id` - schema: type: string enum: - create_subtask - edit_task_settings - track_time - view_detailed_data example: create_subtask,track_time in: query name: perms description: comma separated permission names to filter tasks by - schema: type: integer enum: - 0 - 1 in: query name: exclude_archived deprecated: true description: '`0` -> show only archived, `1` -> show all tasks' - schema: type: string enum: - active - archived - all default: active in: query name: status description: filters tasks by status - schema: type: string enum: - '0' - '1' default: '0' in: query description: returns minimal tasks info - works only if specific task **was not** requested name: minimal - schema: type: boolean in: query name: ignoreAdminRights description: only return tasks that user would have access to regardless of being a time tracking admin security: - api_key_in_header: [] post: operationId: post--tasks description: Create new task. To ceate new task you should have proper permissions. tags: - '[v1] Task' responses: '201': description: Created content: application/json: schema: type: object properties: '[task_id]': type: object properties: task_id: oneOf: - type: string - type: integer minLength: 1 parent_id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 external_task_id: oneOf: - type: string - type: integer nullable: true external_parent_id: oneOf: - type: string - type: integer nullable: true level: oneOf: - type: string - type: integer minLength: 1 add_date: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 color: type: string minLength: 1 tags: type: string deprecated: true budgeted: oneOf: - type: string - type: integer minLength: 1 checked_date: type: string nullable: true root_group_id: oneOf: - type: string - type: integer minLength: 1 assigned_to: oneOf: - type: string - type: integer nullable: true assigned_by: oneOf: - type: string - type: integer minLength: 1 due_date: type: string nullable: true note: type: string nullable: true context: type: string nullable: true folder: type: string nullable: true repeat: oneOf: - type: string - type: integer nullable: true billable: oneOf: - type: string - type: integer minLength: 1 budget_unit: type: string minLength: 1 public_hash: type: string nullable: true modify_time: type: string nullable: true keywords: type: string examples: Created task named "API TEST": value: '81278270': task_id: '81278270' parent_id: '0' name: API TEST external_task_id: null external_parent_id: null level: '1' add_date: '2021-03-15 14:36:06' archived: '0' color: '#34C644' tags: '' budgeted: '0' checked_date: null root_group_id: '123' assigned_to: null assigned_by: '111' due_date: null note: null context: null folder: null repeat: null billable: '1' budget_unit: hours public_hash: null modify_time: null keywords: '' '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: task name not provided: value: message: 'You must provide a name for the task with post field: name' summary: Create new task requestBody: content: application/json: schema: type: object required: - name properties: name: type: string description: task name example: Development tags: type: string description: comma separated tags' names example: IT, R&D deprecated: true parent_id: oneOf: - type: string - type: integer description: task parent id example: 523 external_task_id: type: string description: external task id ie. id of task in other system/integration example: xero_g8g89s78ds8 external_parent_id: type: string description: external parent id ie. id of parent task in other system/integration example: xero_2b5b26tb295bb9 budgeted: type: integer description: task budget value, defined in the unit specified by `budget_unit` example: 1000 note: type: string description: description for task example: Development task note archived: type: integer description: is task archived enum: - '0' - '1' billable: type: integer description: is task billable enum: - 0 - 1 budget_unit: type: string description: 'budget unit: `hours`, `fee` or empty' enum: - hours - fee user_ids: type: string description: comma separated user ids to add to task example: 22,521,2,25 role: description: works only if `user_ids` are provided - sets given role to given `user_ids` in created task example: '5325' type: integer keywords: type: string example: IT, R&D description: comma separated keywords security: - api_key_in_header: [] put: operationId: put--tasks description: Modify existing task. To modify a task you should have proper permissions. tags: - '[v1] Task' responses: '200': description: OK content: application/json: schema: type: object properties: task_id: oneOf: - type: string - type: integer minLength: 1 parent_id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 external_task_id: oneOf: - type: string - type: integer nullable: true external_parent_id: oneOf: - type: string - type: integer nullable: true level: oneOf: - type: string - type: integer minLength: 1 add_date: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 color: type: string minLength: 1 tags: type: string minLength: 1 deprecated: true budgeted: oneOf: - type: string - type: integer minLength: 1 deprecated: true description: | Deprecated — use `GET /v3/task/{taskId}/billing-settings` (`budget` field) instead. checked_date: type: string nullable: true root_group_id: oneOf: - type: string - type: integer minLength: 1 assigned_to: oneOf: - type: string - type: integer nullable: true assigned_by: oneOf: - type: string - type: integer minLength: 1 due_date: type: string nullable: true note: type: string nullable: true context: type: string nullable: true folder: type: string nullable: true repeat: type: string nullable: true billable: oneOf: - type: string - type: integer minLength: 1 deprecated: true description: | Deprecated — use `GET /v3/task/{taskId}/billing-settings` (`billable` field) instead. budget_unit: type: string minLength: 1 deprecated: true description: | Deprecated — use `GET /v3/task/{taskId}/billing-settings` (`budgetUnit` field) instead. public_hash: type: string nullable: true modify_time: type: string minLength: 1 keywords: type: string examples: changed name and tags: value: task_id: '81278276' parent_id: '0' name: new name external_task_id: null external_parent_id: null level: '1' add_date: '2021-03-16 09:00:03' archived: '0' color: '#34C644' tags: new tags budgeted: '0' checked_date: null root_group_id: '1234' assigned_to: null assigned_by: '24' due_date: null note: null context: null folder: null repeat: null billable: '1' budget_unit: hours public_hash: null modify_time: '2021-03-16 10:54:59' keywords: new tags '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: not permitted to edit this task: value: message: You do not have permissions to modify this task or it does not exist '404': description: Not Found is returned with empty body when given `task_id` is not found. summary: Update task info requestBody: content: application/json: schema: type: object required: - task_id properties: task_id: oneOf: - type: string - type: integer description: task id to update example: '52525' name: type: string description: new task name example: SomeNewTaskName tags: type: string description: comma separated tags' names example: IT,R&D deprecated: true parent_id: oneOf: - type: string - type: integer description: new parent id example: 5252 external_task_id: type: string description: external task id ie. id of task in other system/integration example: xero_g8g89s78ds8 external_parent_id: type: string description: external parent id ie. id of parent task in other system/integration example: xero_2b5b26tb295bb9 budgeted: type: integer description: | Deprecated — use `PATCH /v3/task/{taskId}/billing-settings` with `budget` field instead. Task budget value, defined in the unit specified by `budget_unit`. example: 1000 deprecated: true note: type: string description: description for task example: SomeNewNote archived: type: integer description: is task archived enum: - 0 - 1 billable: type: integer description: | Deprecated — use `PATCH /v3/task/{taskId}/billing-settings` with `billable` field instead. Is task billable. enum: - 0 - 1 deprecated: true budget_unit: type: string description: | Deprecated — use `PATCH /v3/task/{taskId}/billing-settings` with `budgetUnit` field instead. Budget unit: `hours`, `fee` or empty. enum: - hours - fee deprecated: true user_ids: type: string description: comma separated user ids to update role in task example: 22,521,2,25 role: type: integer description: works only if `user_ids` are provided - updates role for`user_ids` example: 5215 keywords: type: string example: IT,R&D description: comma separated keywords examples: change name and tags: value: task_id: 81209723 name: new name tags: new,tags,added description: '' security: - api_key_in_header: [] delete: deprecated: true operationId: delete--tasks description: |- >Endpoint deprecated instead use this Delete task. To delete a task you should have proper permissions. You need to include `task_id` in GET. tags: - '[v1] Task' responses: '200': description: OK content: application/json: schema: type: object properties: task_id: oneOf: - type: string - type: integer minLength: 1 parent_id: oneOf: - type: string - type: integer minLength: 1 name: type: string minLength: 1 external_task_id: oneOf: - type: string - type: integer nullable: true external_parent_id: oneOf: - type: string - type: integer nullable: true level: oneOf: - type: string - type: integer minLength: 1 add_date: type: string minLength: 1 archived: oneOf: - type: string - type: integer minLength: 1 color: type: string minLength: 1 tags: type: string deprecated: true budgeted: oneOf: - type: string - type: integer minLength: 1 checked_date: type: string nullable: true root_group_id: oneOf: - type: string - type: integer minLength: 1 assigned_to: oneOf: - type: string - type: integer nullable: true assigned_by: oneOf: - type: string - type: integer minLength: 1 due_date: type: string nullable: true note: type: string nullable: true context: type: string nullable: true folder: type: string nullable: true repeat: type: string nullable: true billable: oneOf: - type: string - type: integer minLength: 1 budget_unit: type: string minLength: 1 public_hash: type: string nullable: true modify_time: type: string nullable: true keywords: type: string examples: deleted task: value: task_id: '81278270' parent_id: '0' name: API TEST external_task_id: null external_parent_id: null level: '1' add_date: '2021-03-15 14:36:06' archived: '0' color: '#34C644' tags: '' budgeted: '0' checked_date: null root_group_id: '1234' assigned_to: null assigned_by: '12' due_date: null note: null context: null folder: null repeat: null billable: '1' budget_unit: hours public_hash: null modify_time: null keywords: '' '403': description: Forbidden '404': description: Not Found summary: Delete task parameters: - schema: type: string in: query name: task_id description: task id to delete required: true security: - api_key_in_header: [] /task_color: put: operationId: put--task_color description: Creates job to add/change a task color (for everyone). tags: - '[v1] Task' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: changedTasks: type: object properties: '[hex_color]': type: array items: type: object taskJobResultId: type: boolean examples: successfully changed color: value: changedTasks: '#688fe3': - '81278276' taskJobResultId: false changing color failed - note lack of task_id in response: value: changedTasks: '#688fe3': - null taskJobResultId: false summary: Add/change color in task requestBody: content: application/json: schema: type: object properties: task_id: oneOf: - type: string - type: integer description: task id example: 521523 color: type: string description: color in hex example: '#688fe3' is_for_all_subtasks: type: boolean description: 'is color for all subtasks, default: `false`' required: - task_id - color examples: change color in task: value: task_id: 81278276 color: '#688fe3' description: '' security: - api_key_in_header: [] /task_details: get: operationId: get--task_details description: Get task details. responses: '200': description: OK - if given ids are not found an empty array is returned. content: application/json: schema: type: array description: '' minItems: 1 uniqueItems: true items: type: object properties: task_id: type: number parent_id: type: number name: type: string minLength: 1 color: type: string minLength: 1 breadcrumb: type: string examples: Tasks info: value: - task_id: 81278274 parent_id: 0 name: TEST3 color: '#34C644' breadcrumb: '' - task_id: 81278275 parent_id: 0 name: TEST4 color: '#34C644' breadcrumb: '' Task not found: value: [] tags: - '[v1] Task' summary: Get task details parameters: - schema: type: string in: query name: tasks description: comma separated tasks ids to get required: true security: - api_key_in_header: [] /tt_role: get: operationId: get--tt_role description: Returns roles allowed for your root group with permissions. responses: '200': description: OK content: application/json: schema: description: '' type: object properties: '[tt_role_id]': type: object properties: tt_role_id: oneOf: - type: string - type: integer minLength: 1 tt_role_name: type: string minLength: 1 overridden_role_id: oneOf: - type: string - type: integer minLength: 1 root_group_id: oneOf: - type: string - type: integer minLength: 1 tt_role_sort: type: integer perms: type: object description: array of permissions properties: '[tt_perm_id]': type: object description: '' properties: tt_perm_id: oneOf: - type: string - type: integer minLength: 1 tt_perm_text: type: string minLength: 1 examples: returned role with permissions: value: '1': tt_role_id: '1' tt_role_name: Project Manager overridden_role_id: '0' root_group_id: '0' tt_role_sort: 0 perms: '1': tt_perm_id: '1' tt_perm_text: create subtasks '2': tt_perm_id: '2' tt_perm_text: edit task '3': tt_perm_id: '3' tt_perm_text: track time '5': tt_perm_id: '5' tt_perm_text: see other people time in reports '6': tt_perm_id: '6' tt_perm_text: change inherited role to lower '7': tt_perm_id: '7' tt_perm_text: create invoice '3': tt_role_id: '3' tt_role_name: Regular User overridden_role_id: '0' root_group_id: '0' tt_role_sort: 2 perms: '3': tt_perm_id: '3' tt_perm_text: track time '4': tt_role_id: '4' tt_role_name: Guest overridden_role_id: '0' root_group_id: '0' tt_role_sort: 3 perms: '5': tt_perm_id: '5' tt_perm_text: see other people time in reports summary: Get time tracking roles tags: - '[v1] Roles & Permissions' security: - api_key_in_header: [] delete: operationId: delete--tt_role description: Delete time tracking role. responses: '200': description: OK - returns all roles (before update), just like in GET option. '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: users assigned: value: message: You can not delete role because there are users assigned to tasks with that role. cannot delete: value: message: You can not delete this role! not permitted: value: message: Role couldn't be saved summary: Delete time tracking role requestBody: content: application/json: schema: type: object properties: tt_role_id: type: integer description: role it to delete required: - tt_role_id tags: - '[v1] Roles & Permissions' security: - api_key_in_header: [] post: operationId: post--tt_role description: Create time tracking role. responses: '201': description: Created content: application/json: schema: description: '' type: object properties: tt_role_id: oneOf: - type: string - type: integer minLength: 1 tt_role_name: type: string minLength: 1 root_group_id: oneOf: - type: string - type: integer minLength: 1 overridden_role_id: oneOf: - type: string - type: integer minLength: 1 tt_role_sort: type: integer examples: created role: value: tt_role_id: '7159' tt_role_name: New role created by api root_group_id: '5262' overridden_role_id: '0' tt_role_sort: 4 '400': description: Bad Request content: application/json: schema: type: object properties: message: type: string examples: could not save new role: value: message: Role could not be saved '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: role exists: value: message: This role already exists not permitted: value: message: Role couldn't be saved summary: Create time tracking role requestBody: content: application/json: schema: type: object properties: tt_role_name: type: string description: name of the role tt_role_sort: type: integer description: role priority (lower number means higher priority) perms: type: object description: array of permissions to add to role properties: '[perm_id]': type: integer description: '[perm-id] as key and `1` as value to add given [perm-id] to role' examples: creating new role with some permissions: value: tt_role_name: New role created by api tt_role_sort: 4 perms: '6': 1 '7': 1 tags: - '[v1] Roles & Permissions' security: - api_key_in_header: [] put: operationId: put--tt_role description: Update time tracking role. Note you can't edit `Regular User` role. responses: '200': description: OK - returns all roles (before update), just like in GET option. '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: not permitted: value: message: Role couldn't be saved editing regular user role: value: message: You can't modify regular user role! '406': description: Not Acceptable content: application/json: schema: type: object properties: message: type: string examples: setting priority failed: value: message: Error while setting priority. summary: Update time tracking role requestBody: content: application/json: schema: type: object properties: tt_role_id: type: integer description: role id to update tt_role_sort: type: integer description: role priority (lower number means higher priority) perms: type: object description: array of permissions to add to role properties: '[perm_id]': type: integer description: '[perm-id] as key and `1` as value to add given [perm-id] to role' examples: add two permissions to role and set role priority: value: tt_role_id: 7157 tt_role_sort: 4 perms: '6': 1 '7': 1 description: '' tags: - '[v1] Roles & Permissions' security: - api_key_in_header: [] /timer: summary: Timer manipulation post: operationId: post-timer responses: '200': description: OK content: application/json: schema: description: '' type: object properties: isTimerRunning: type: boolean elapsed: type: number entry_id: oneOf: - type: number - type: string timer_id: oneOf: - type: number - type: string start_time: type: string minLength: 1 examples: status when timer is stopped: value: isTimerRunning: false elapsed: 0 response to action start: value: new_timer_id: 2 entry_id: 103217709 status when timer is running: value: isTimerRunning: true elapsed: 55 entry_id: '103217709' timer_id: '2' start_time: '2020-01-01 12:34:56' response to action stop: value: elapsed: 224 entry_id: '103217709' entry_time: 224 '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string required: - message examples: bad request: value: message: This action is not allowed. '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: not permitted to task: value: message: You cannot track time to this task '404': description: Not Found content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: task not found: value: message: No task with such ID tags: - '[v1] Timer' description: Get timer status, start new timer or stop one. requestBody: content: application/json: schema: type: object properties: action: type: string description: either `status`, `start` or `stop` enum: - status - start - stop default: status task_id: type: integer description: start a task with a given task started_at: type: string description: timer will count time since this date only when `action` = `start` example: '2021-03-05 08:54:12' stopped_at: type: string description: timer will count time to this date only when `action` = `stop` example: '2021-03-05 09:54:12' required: - action examples: status: value: action: status start: value: action: start stop: value: action: stop start with task: value: action: start task_id: 12345 start with start date: value: action: start started_at: '2021-03-05 08:54:12' stop with stop date: value: action: stop stopped_at: '2021-03-05 09:54:12' description: '' parameters: [] summary: Start, stop, get timer security: - api_key_in_header: [] delete: summary: Delete timer operationId: delete-timer responses: '200': description: OK - response body is empty content: application/json: schema: type: object properties: '""': {} description: Deletes timer without saving tracked time. tags: - '[v1] Timer' security: - api_key_in_header: [] /user: post: summary: Update user operationId: post-user-user_id responses: '200': description: OK - returns empty response when everything went ok '400': description: Bad Request content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 examples: no data to update provided: value: message: 'You must send valid group fields to change: language, display_name, email, time_zone, current_password, new_password, confirm_new_password, summary' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: cant edit multiple users: value: message: You can change one user at time not permitted to edit user or user does not exist: value: message: You can not change this user description: | Update user's data. If `user_id` is not provided, the data for the user associated with the API key will be updated. requestBody: content: application/json: schema: type: object properties: get_users: type: boolean description: if provided then returns users data user_id: type: string description: user id to update or comma-separated user ids to get if `get_users` is `true` example: '13' display_name: type: string description: user display name, typically name and surname description: '' tags: - '[v1] User' security: - api_key_in_header: [] parameters: [] /user/{user_id}: get: summary: Get user tags: - '[v1] User' responses: '200': description: OK content: application/json: schema: description: '' type: object properties: user_id: oneOf: - type: string - type: integer minLength: 1 language: oneOf: - type: string - type: integer minLength: 1 email: type: string minLength: 1 login_count: oneOf: - type: string - type: integer minLength: 1 login_time: type: string minLength: 1 display_name: type: string minLength: 1 time_zone: type: string minLength: 1 root_group_id: oneOf: - type: string - type: integer minLength: 1 summary: oneOf: - type: string - type: integer minLength: 1 agent: type: string minLength: 1 primary_group_id: type: integer examples: Example: value: user_id: '4213' language: '0' email: example@email.com login_count: '22084' login_time: '2021-03-11 10:21:15' display_name: John Smith time_zone: '0' root_group_id: '552' summary: '1' agent: 1.7.1.2| primary_group_id: 552 operationId: get-user-s description: Returns user's information. If `user_id` is not provided then returns current user data. Provide comma separated ids for multiple users ie. `132,423,456`. security: - api_key_in_header: [] parameters: - schema: type: integer name: user_id in: path required: true description: user id /task/{task_id}/rate: parameters: - schema: type: string example: 44 or 44,45,252 name: task_id in: path required: true description: task id get: summary: Get billing rate for task tags: - '[v1] Billing Rates' responses: '200': description: OK content: application/json: schema: description: '' type: object x-examples: example-1: '75091248': - rateId: 145996 rateTypeId: 12 value: '21.00' refType: task addDate: '2000-01-01' refId: '75091248' properties: '[task_id]': type: array uniqueItems: true items: type: object properties: rateId: type: number rateTypeId: type: number value: type: string refType: type: string addDate: type: string refId: type: string examples: returned all billing rates for task 75091248: value: '75091248': - rateId: 145996 rateTypeId: 12 value: '21.00' refType: task addDate: '2000-01-01' refId: '75091248' - rateId: 145995 rateTypeId: 13 value: '12.00' refType: task addDate: '2000-01-01' refId: '75091248' returned billing rate with given rate_id 13 for task 75091248: value: '75091248': - rateId: 145995 rateTypeId: 13 value: '12.00' refType: task addDate: '2000-01-01' refId: '75091248' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: You are not allowed to browse rates examples: not allowed: value: message: You are not allowed to browse rates '404': description: Not Found content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: Task 23 not found examples: task not found: value: message: Task 23 not found operationId: get-task-task_id-rate description: Returns all billing rates for given `task_id` or returns specific `rate_id` data for given `task_id`. parameters: - schema: type: string in: query name: rate_id description: rateTypeId to get (can be empty, `all` or comma-separated) security: - api_key_in_header: [] post: summary: Update/create billing rate for task operationId: post-task-task_id-rate responses: '201': description: Created content: application/json: schema: description: '' type: object x-examples: example-1: rateId: 145999 rateTypeId: 23 value: 333 refType: task addDate: '2021-09-09' refId: '75091248' properties: rateId: type: number rateTypeId: type: number value: type: number refType: type: string addDate: type: string refId: type: string examples: created/updated rate: value: rateId: 145999 rateTypeId: 23 value: 333 refType: task addDate: '2021-09-09' refId: '75091248' '403': description: Forbidden content: application/json: schema: description: '' type: object x-examples: example-1: message: Task 3 not found properties: message: type: string minLength: 1 examples: not allowed because of permissions: value: message: You are not allowed to browse rates not allowed because of your plan: value: message: You are not allowed to use specific billing rates. Please upgrade Your plan. '404': description: Not Found content: application/json: schema: description: '' type: object x-examples: example-1: message: Task 3 not found properties: message: type: string minLength: 1 examples: task id not found: value: message: Task 3 not found rateTypeId not found: value: message: RateType 123 not found description: This endpoint updates value or creates new rate for given `rateTypeId` and `task_id`. requestBody: content: application/json: schema: description: '' type: object x-examples: example-1: rateTypeId: 23 value: 333 addDate: '2021-09-09' properties: rateTypeId: type: number description: rateTypeId for rate to modify or create new one value: type: number description: value of rate addDate: type: string description: optional date in `YY-MM-DD` format example: '2021-09-09' required: - rateTypeId examples: create new rate, which type id is `23` and value `333` with date: value: rateTypeId: 23 value: 333 addDate: '2021-09-09' tags: - '[v1] Billing Rates' security: - api_key_in_header: [] /user/{user_id}/rate: parameters: - schema: type: string name: user_id in: path required: true description: user id or comma-separated users ids get: summary: Get billing rate for user tags: - '[v1] Billing Rates' responses: '200': description: OK - returns empty array when given `user_id` does not exist or given `rate_id` does not exist or simply billing rates were not found. content: application/json: schema: description: '' type: object x-examples: example-1: '1787724': - rateId: 146002 rateTypeId: 12 value: '22.00' refType: user addDate: '2000-01-01' refId: '1787724' properties: '[user_id]': type: array uniqueItems: true minItems: 1 items: type: object properties: rateId: type: number rateTypeId: type: number value: type: string refType: type: string addDate: type: string refId: type: string required: - '[user_id]' examples: returned billing rates for user 1787724: value: '1787724': - rateId: 146002 rateTypeId: 12 value: '22.00' refType: user addDate: '2000-01-01' refId: '1787724' - rateId: 146001 rateTypeId: 13 value: '11.00' refType: user addDate: '2000-01-01' refId: '1787724' returned billing rate for rateTypeId 12 for user 1787724: value: '1787724': - rateId: 146002 rateTypeId: 12 value: '22.00' refType: user addDate: '2000-01-01' refId: '1787724' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: You are not allowed to browse rates examples: not allowed: value: message: You are not allowed to browse rates operationId: get-user-user_id-rate description: Returns billing rate for given user or users. parameters: - schema: type: string in: query name: rate_id description: rateTypeId or comma-separated rateTypeIds security: - api_key_in_header: [] post: summary: Update/create billing rate for user tags: - '[v1] Billing Rates' responses: '201': description: Created content: application/json: schema: description: '' type: object properties: rateId: type: number rateTypeId: type: number value: type: number refType: type: string minLength: 1 addDate: type: string minLength: 1 refId: type: string minLength: 1 required: - rateId - rateTypeId - value - refType - addDate - refId x-examples: example-1: rateId: 146003 rateTypeId: 23 value: 3 refType: user addDate: '2021-05-27' refId: '1787724' examples: updated/created rate: value: rateId: 146003 rateTypeId: 23 value: 3 refType: user addDate: '2021-05-27' refId: '1787724' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: You are not allowed to browse rates examples: not allowed due to permissions: value: message: You are not allowed to browse rates not allowed due to plan: value: message: You are not allowed to use specific billing rates. Please upgrade Your plan. '404': description: Not Found content: application/json: schema: description: '' type: string x-examples: example-1: RateType 1 not found examples: given rateTypeId not found: value: RateType 1 not found operationId: post-user-user_id-rate description: This endpoint updates value or creates new rate for given `rateTypeId` and `user_id`. requestBody: content: application/json: schema: description: '' type: object x-examples: example-1: rateTypeId: 23 value: 333 addDate: '2021-09-09' properties: rateTypeId: type: number description: rateTypeId to add or update value: type: number description: rate's value addDate: type: string minLength: 1 description: date in `YY-MM-DD` format required: - rateTypeId examples: create rateTypeId 23 to value 333 with date 2021-09-09: value: rateTypeId: 23 value: 333 addDate: '2021-09-09' update rateTypeId 23 to value 3: value: rateTypeId: 23 value: 3 security: - api_key_in_header: [] /task/{task_id}/user/{user_id}/rate: parameters: - schema: type: string example: 44 or 44,45,252 name: task_id in: path required: true description: task id - schema: type: string example: 12 or 12,15,16 or all name: user_id in: path required: true description: user id or comma-separated users ids or "all" get: summary: Get billing rate for "task user" tags: - '[v1] Billing Rates' responses: '200': description: OK content: application/json: schema: description: '' type: object x-examples: example-1: '75091248': - rateId: 145996 rateTypeId: 12 value: '21.00' refType: task_user addDate: '2000-01-01' refId: '75091248' properties: '[rate]': type: array uniqueItems: true items: type: object properties: rateId: type: number rateTypeId: type: number value: type: string refType: type: string addDate: type: string refId: type: string examples: returned all billing rates for task 75091248 and user 12343: value: '75091248': - rateId: 145996 rateTypeId: 12 value: '21.00' refType: task_user addDate: '2000-01-01' refId: '75091248_12343' - rateId: 145995 rateTypeId: 13 value: '12.00' refType: task_user addDate: '2000-01-01' refId: '75091248_12343' returned billing rate with given rate_id 13 for task 75091248 and user 12343: value: '75091248': - rateId: 145995 rateTypeId: 13 value: '12.00' refType: task_user addDate: '2000-01-01' refId: '75091248_12343' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: You are not allowed to browse rates examples: not allowed: value: message: You are not allowed to browse rates '404': description: Not Found content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: Task 23 not found examples: task not found: value: message: Task 23 not found operationId: get-task-user-rate description: Returns all billing rates for given `task_id` and `user_id` or returns specific `rate_id` data for given `task_id` and `user_id`. parameters: - schema: type: string in: query name: rate_id description: rateTypeId to get (can be empty, `all` or comma-separated) security: - api_key_in_header: [] post: summary: Update/create billing rate for "task user" operationId: post-task-user-rate responses: '201': description: Created content: application/json: schema: description: '' type: object x-examples: example-1: rateId: 145999 rateTypeId: 23 value: 333 refType: task_user addDate: '2021-09-09' refId: '75091248_12343' properties: rateId: type: number rateTypeId: type: number value: type: number refType: type: string addDate: type: string refId: type: string examples: created/updated rate: value: rateId: 145999 rateTypeId: 23 value: 333 refType: task_user addDate: '2021-09-09' refId: '75091248_12343' '403': description: Forbidden content: application/json: schema: description: '' type: object x-examples: example-1: message: Task 3 not found properties: message: type: string minLength: 1 examples: not allowed because of permissions: value: message: You are not allowed to browse rates not allowed because of your plan: value: message: You are not allowed to use specific billing rates. Please upgrade Your plan. '404': description: Not Found content: application/json: schema: description: '' type: object x-examples: example-1: message: Task 3 not found properties: message: type: string minLength: 1 examples: task id not found: value: message: Task 3 not found rateTypeId not found: value: message: RateType 123 not found description: This endpoint updates value or creates new rate for given `rateTypeId` and `task_id`. requestBody: content: application/json: schema: description: '' type: object x-examples: example-1: rateTypeId: 23 value: 333 addDate: '2021-09-09' properties: rateTypeId: type: number description: rateTypeId for rate to modify or create new one value: type: number description: value of rate addDate: type: string description: optional date in `YY-MM-DD` format example: '2021-09-09' required: - rateTypeId examples: create new rate, which type id is `23` and value `333` with date: value: rateTypeId: 23 value: 333 addDate: '2021-09-09' tags: - '[v1] Billing Rates' security: - api_key_in_header: [] /group/{group_id}/rate: parameters: - schema: type: string example: 11 or 11,12,17 name: group_id in: path required: true description: group id get: summary: Get billing rate for group tags: - '[v1] Billing Rates' responses: '200': description: OK content: application/json: schema: description: '' type: object x-examples: example-1: '75091248': - rateId: 145996 rateTypeId: 12 value: '21.00' refType: task addDate: '2000-01-01' refId: '75091248' properties: '[group_id]': type: array uniqueItems: true items: type: object properties: rateId: type: number rateTypeId: type: number value: type: string refType: type: string addDate: type: string refId: type: string examples: returned all billing rates for group 75091248: value: '75091248': - rateId: 145996 rateTypeId: 12 value: '21.00' refType: group addDate: '2000-01-01' refId: '75091248' - rateId: 145995 rateTypeId: 13 value: '12.00' refType: group addDate: '2000-01-01' refId: '75091248' returned billing rate with given rate_id 13 for group 75091248: value: '75091248': - rateId: 145995 rateTypeId: 13 value: '12.00' refType: group addDate: '2000-01-01' refId: '75091248' '403': description: Forbidden content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: You are not allowed to browse rates examples: not allowed: value: message: You are not allowed to browse rates '404': description: Not Found content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message x-examples: example-1: message: Group 23 not found examples: task not found: value: message: Group 23 not found operationId: get-group-rate description: Returns all billing rates for given `group_id` or returns specific `rate_id` data for given `group_id`. parameters: - schema: type: string in: query name: rate_id description: rateTypeId to get (can be empty, `all` or comma-separated) security: - api_key_in_header: [] post: summary: Update/create billing rate for group operationId: post-group-rate responses: '201': description: Created content: application/json: schema: description: '' type: object x-examples: example-1: rateId: 145999 rateTypeId: 23 value: 333 refType: group addDate: '2021-09-09' refId: '75091248' properties: rateId: type: number rateTypeId: type: number value: type: number refType: type: string addDate: type: string refId: type: string examples: created/updated rate: value: rateId: 145999 rateTypeId: 23 value: 333 refType: group addDate: '2021-09-09' refId: '75091248' '403': description: Forbidden content: application/json: schema: description: '' type: object x-examples: example-1: message: Group 3 not found properties: message: type: string minLength: 1 examples: not allowed because of permissions: value: message: You are not allowed to browse rates not allowed because of your plan: value: message: You are not allowed to use specific billing rates. Please upgrade Your plan. '404': description: Not Found content: application/json: schema: description: '' type: object x-examples: example-1: message: Group 3 not found properties: message: type: string minLength: 1 examples: task id not found: value: message: Group 3 not found rateTypeId not found: value: message: RateType 123 not found description: This endpoint updates value or creates new rate for given `rateTypeId` and `group_id`. requestBody: content: application/json: schema: description: '' type: object x-examples: example-1: rateTypeId: 23 value: 333 addDate: '2021-09-09' properties: rateTypeId: type: number description: rateTypeId for rate to modify or create new one value: type: number description: value of rate addDate: type: string description: optional date in `YY-MM-DD` format example: '2021-09-09' required: - rateTypeId examples: create new rate, which type id is `23` and value `333` with date: value: rateTypeId: 23 value: 333 addDate: '2021-09-09' tags: - '[v1] Billing Rates' security: - api_key_in_header: [] /logged_time_in_week: get: summary: Get logged time in a week tags: - '[v1] Entry' responses: '200': description: OK content: application/json: schema: description: '' x-examples: example-1: '2019-12-02': 17130 '2019-12-03': 27300 '2019-12-04': 36365 '2019-12-05': 198900 '2019-12-06': 27300 '2019-12-07': 4835 '2019-12-08': 1800 type: object properties: '[day]': type: number description: number of seconds logged on this day examples: example response for given `day` = "2019-12-05": value: '2019-12-02': 17130 '2019-12-03': 27300 '2019-12-04': 36365 '2019-12-05': 198900 '2019-12-06': 27300 '2019-12-07': 4835 '2019-12-08': 1800 operationId: get-logged_time_in_week description: This endpoint gets a `day` and returns array with summarized entries time per day for this week. The time is returned in seconds. parameters: - schema: type: string example: '2019-12-07' in: query name: day required: true description: day in `YYYY-MM-DD` format security: - api_key_in_header: [] /attendance/day_type: get: summary: Retrieves day types declared by users in given timeframe tags: - '[v1] Attendance' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: '1700567': '2022-10-10': day_type: Remote work properties: userId: type: object properties: date: type: object properties: day_type: type: string '': type: string examples: Example 1: value: {} application/xml: examples: Example 1: value: |- { "userId": { "2022-10-10": { "day_type": "Remote work" }, } } multipart/form-data: schema: type: object properties: {} operationId: get-attendance-day_type parameters: - schema: type: string in: query name: from description: date in `YYYY-MM-DD` format required: true - schema: type: string in: query name: to description: date in `YYYY-MM-DD` format required: true - schema: type: string in: header name: Accept description: Header for json data format - schema: type: string in: query name: usersIds description: user Id's separated by comma description: Get day types for giver period for team security: - api_key_in_header: [] /attendance/{userId}/user: get: operationId: get-attendance-for-user summary: Retrieve attendance data for a user within a date range parameters: - name: userId in: path required: true description: ID of the user whose attendance is being retrieved schema: type: integer - name: start in: query required: true description: Start date in YYYY-MM-DD format schema: type: string format: date - name: end in: query required: true description: End date in YYYY-MM-DD format schema: type: string format: date responses: '200': description: Successfully retrieved attendance data content: application/json: schema: type: object properties: data: type: object additionalProperties: type: object properties: userId: type: integer day: type: string format: date dayTypeId: type: integer dayType: type: string shouldBe: type: integer vacationTime: type: integer '400': description: Bad request due to missing or invalid parameters content: application/json: schema: type: object properties: message: type: string error: type: string '403': description: Forbidden access due to permissions or disabled module content: application/json: schema: type: object properties: message: type: string error: type: string '404': description: User not found content: application/json: schema: type: object properties: message: type: string error: type: string security: - api_key_in_header: [] tags: - '[v1] Attendance' post: summary: Insert or update user attendance records operationId: post-attendance-for-user description: | Inserts or updates attendance records for a user. Each entry corresponds to one day. The `shouldBe` and `vacationTime` fields are optional. **Important:** The date range constraint does not mean a limit of 100 entries, but rather that the maximum range between the earliest and latest dates in the payload must not exceed 100 days. parameters: - name: userId in: path required: true schema: type: integer description: ID of the user whose attendance is being updated requestBody: required: true content: application/json: schema: type: array items: type: object properties: day: type: string format: date example: '2025-03-01' dayTypeId: type: integer example: 12 shouldBe: type: integer example: 480 description: Optional - expected working time in minutes vacationTime: type: integer example: 0 description: Optional - vacation time in minutes description: List of attendance records to insert or update responses: '200': description: Attendance was updated successfully content: application/json: schema: type: object properties: message: type: string example: Attendance was updated successfully. '400': description: Bad Request - Invalid payload content: application/json: schema: type: object properties: message: type: string example: Invalid payload. error: type: string example: 'The provided date range exceeds the allowed limit of 100 days. Given range: 385 days.' '403': description: Forbidden - Not allowed to modify attendance or attendance module is disabled content: application/json: schema: type: object properties: message: type: string '404': description: Not Found - User was not found content: application/json: schema: type: object properties: message: type: string security: - api_key_in_header: [] tags: - '[v1] Attendance' /attendance/day_types: get: operationId: get-attendance-day-types summary: Retrieve all possible day types for attendance description: Returns a list of all possible day types to declare in attendance. responses: '200': description: A list of day types. content: application/json: schema: type: object properties: data: type: object additionalProperties: type: object properties: id: type: integer example: 12 slug: type: string example: normal name: type: string example: Working Day isDayOff: type: boolean example: false isDefault: type: boolean example: true isActive: type: boolean example: true options: type: object properties: color: type: string example: eeeeee '403': description: Forbidden - Attendance module is not enabled content: application/json: schema: type: object properties: message: type: string security: - api_key_in_header: [] tags: - '[v1] Attendance' /task/{task_id}/tag: parameters: - schema: type: string name: task_id in: path required: true delete: summary: Remove tags from task tags: - '[v1] Task' - '[v1] Tags' responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string '404': description: Not Found content: application/json: schema: type: object properties: message: type: string operationId: delete-task-task_id-tag security: - api_key_in_header: [] post: summary: Add tags to task tags: - '[v1] Task' - '[v1] Tags' responses: '201': description: Created content: application/json: schema: type: object properties: message: type: string '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string '404': description: Not Found content: application/json: schema: type: object properties: message: type: string operationId: post-task-task_id-tag requestBody: content: application/json: schema: type: object properties: tags: type: array description: |- { "tag_id": integer, "mandatory" boolean } items: {} examples: Example 1: value: tags: - tag_id: 1 mandatory: 'false' security: - api_key_in_header: [] put: summary: Edit tags assignment type tags: - '[v1] Task' - '[v1] Tags' responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string '404': description: Not Found content: application/json: schema: type: object properties: message: type: string operationId: put-task-task_id-tag description: '' requestBody: content: application/json: schema: type: object properties: tags: type: array description: |- { "tag_id": integer, "mandatory" boolean } items: {} examples: Example 1: value: tags: - tag_id: 1 mandatory: true security: - api_key_in_header: [] /v3/task-archive/archive-batch: patch: summary: Archive a batch of tasks description: | Queues multiple active tasks for archiving. Tasks that are already archived are skipped. tags: - '[v3] Task Archive' requestBody: required: true content: application/json: schema: type: object properties: taskIds: type: array items: type: integer description: List of task IDs to archive. required: - taskIds examples: Example 1: value: taskIds: - 1 - 2 - 3 - 4 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: 4 tasks out of 4 has been queued for archiving operationId: patch-task-archive-archive-batch x-internal: false security: - api_key_in_header: [] /v3/task-archive/restore-batch: patch: summary: Restore a batch of archived tasks and their parent hierarchy description: | Restores a batch of archived tasks. When restoring tasks, their parent tasks (if archived) will also be restored to maintain task tree consistency. However, siblings of restored tasks will remain archived unless explicitly included in the batch. This endpoint ensures that the recalculation of the task tree hierarchy is performed once per batch, preventing inconsistencies and race conditions that may occur if multiple single-task restore requests are made concurrently. tags: - '[v3] Task Archive' requestBody: required: true content: application/json: schema: type: object properties: taskIds: type: array items: type: integer description: List of archived task IDs to restore. required: - taskIds examples: Example 1: value: taskIds: - 1 - 2 - 3 - 4 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: ok examples: Example 1: value: message: ok operationId: patch-task-archive-restore-batch x-internal: false security: - api_key_in_header: [] /v3/task/remove: post: summary: Task remove tags: - '[v3] Task' operationId: post-task-remove security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: content: application/json: schema: type: object properties: taskIds: type: array items: type: integer required: - taskIds x-examples: Example 1: taskIds: - 2500464 - 91423694 examples: Example 1: value: taskIds: - 2500464 - 91423694 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: Tasks have been queued for removal examples: Example 1: value: message: Tasks have been queued for removal '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: Can't remove task examples: Example 1: value: message: Can't remove task /v3/task/duplicate: post: summary: Task duplicate tags: - '[v3] Task' operationId: post-task-duplicate security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: content: application/json: schema: type: object properties: taskId: type: integer required: - taskId x-examples: Example 1: taskId: 2500464 examples: Example 1: value: taskId: 2500464 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: Task has been queued for duplication examples: Example 1: value: message: Task has been queued for duplication '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: Can't duplicate task examples: Example 1: value: message: Can't duplicate task /v3/task/{taskId}: parameters: - schema: type: integer example: 2500464 name: taskId in: path required: true description: Task ID. /v3/task/duplicate-batch: post: summary: Task duplicate batch tags: - '[v3] Task' operationId: post-task-duplicate-batch security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: content: application/json: schema: type: object properties: taskIds: type: array items: type: integer minItems: 1 description: If both an ancestor task ID and its descendant task ID are provided, only the highest selected ancestor is queued for duplication. required: - taskIds x-examples: Example 1: taskIds: - 2500464 - 2500465 examples: Example 1: value: taskIds: - 2500464 - 2500465 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: 1 tasks out of 2 have been queued for duplication examples: Example 1: value: message: 1 tasks out of 2 have been queued for duplication '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: Can't duplicate tasks examples: Example 1: value: message: Can't duplicate tasks /v3/task/{id}/worklogs/move: post: summary: Task worklog move tags: - '[v3] Task' operationId: post-task-worklog-move security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer name: id in: path required: true description: Source task ID. requestBody: required: true content: application/json: schema: type: object properties: destinationTaskId: type: integer description: Destination task ID. from: type: string format: date description: Start date of the period to move in `Y-m-d` format. to: type: string format: date description: End date of the period to move in `Y-m-d` format. userIds: type: array items: type: integer required: - destinationTaskId examples: MoveSelectedPeriod: value: destinationTaskId: 2500465 from: '2026-04-01' to: '2026-04-10' userIds: - 15 MoveAllAvailableTime: value: destinationTaskId: 2500465 userIds: - 15 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string entriesMoved: type: integer userLogsMoved: type: integer examples: Example 1: value: message: Task worklogs have been moved. entriesMoved: 12 userLogsMoved: 24 '400': description: Validation failure or payload processing error content: application/json: schema: type: object properties: message: type: string errors: type: array items: type: object properties: property: type: string message: type: string examples: ValidationError: value: message: Request validation failed errors: - property: from message: Invalid time range PayloadProcessingError: value: message: There was an internal error while trying to save this payload '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: You are not allowed to move worklogs /v3/task/{id}/change-parent: post: summary: Task change parent tags: - '[v3] Task' operationId: post-task-change-parent security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer name: id in: path required: true description: Task ID to move. requestBody: required: true content: application/json: schema: type: object properties: parentId: type: integer description: New parent task ID. Use `0` to move the task to the root level. required: - parentId examples: MoveUnderParent: value: parentId: 2500465 MoveToRoot: value: parentId: 0 responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: Task has been queued for change parent '400': description: Validation failure content: application/json: schema: type: object properties: message: type: string errors: type: array items: type: object properties: property: type: string message: type: string examples: Example 1: value: message: Request validation failed errors: - property: parentId message: Parent task ID must be an integer. '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: You are not allowed to change parent task '409': description: Change parent job already in progress content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: Task change parent is already in progress for taskId 2500465. '500': description: Internal server error content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: An unspecified error occurred. /v3/task/{taskId}/billing-settings: parameters: - schema: type: integer example: 2500464 name: taskId in: path required: true description: Task ID. /v3/task/{taskId}/tag-list/{tagListId}: parameters: - schema: type: integer example: 2500464 name: taskId in: path required: true description: Task ID the tag list assignment relates to. - schema: type: integer example: 1234 name: tagListId in: path required: true description: Tag list ID being assigned to or detached from the task. put: summary: Assign or update a tag list assignment for a task description: Idempotent upsert of a direct assignment between a tag list and a task in the `tc_tt_task_tag_lists` table. If a direct row for the given pair `(taskId, tagListId)` already exists, only the `mandatory` flag is updated. If no direct row exists, a new one is created — even when the tag list is already inherited from an ancestor task. This mirrors legacy behaviour from `time_tracking/ajax_edit_save` (`TtModel::updateAssignedTags`) and allows a child task to override or extend an inherited tag list. Single tag assignments (`tc_tt_task_tags`) are out of scope for this endpoint. tags: - '[v3] Tags' operationId: put-task-tag-list-assignment security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - mandatory properties: mandatory: type: boolean description: Whether the tag list is mandatory for time entries logged on this task. examples: Example 1: value: mandatory: true responses: '200': description: OK — assignment was created or updated. content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: Tag list assignment saved. '403': description: Forbidden — user lacks permission to edit task settings. content: application/json: schema: type: object properties: message: type: string '404': description: Not found — task or tag list does not exist within the user's root group. content: application/json: schema: type: object properties: message: type: string '422': description: Unprocessable entity — tag list belongs to a different root group than the task, or payload is invalid. content: application/json: schema: type: object properties: message: type: string delete: summary: Detach a tag list from a task description: Idempotent deletion of the direct assignment row between a tag list and a task in `tc_tt_task_tag_lists`. Only the row with `task_id = taskId` is deleted; rows on ancestor tasks remain untouched, so an inherited tag list will still be visible via `getForTask` after this operation. Returns `204 No Content` even when no direct row existed (mirrors legacy `TtModel::removeTagList`). tags: - '[v3] Tags' operationId: delete-task-tag-list-assignment security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept responses: '204': description: No Content — direct assignment removed (or no-op if it did not exist). '403': description: Forbidden — user lacks permission to edit task settings. content: application/json: schema: type: object properties: message: type: string '404': description: Not found — task does not exist within the user's root group. content: application/json: schema: type: object properties: message: type: string /v3/time-entries: post: operationId: tc2--get--time--entries deprecated: true description: | Deprecated. This endpoint is being moved to `/time-entries/list`. Get time entries by user access and permissions. summary: Get time entries by user permissions security: - api_key_in_header: [] requestBody: content: application/json: schema: description: '' type: object x-examples: example-1: startDate: '2021-12-01' endDate: '2022-01-31' userIds: - 640 - 1961631 taskIds: - 85753039 tagIds: - 1 properties: startDate: type: string description: Start date format: date example: '2022-01-01' endDate: type: string description: End date format: date example: '2022-01-31' userIds: type: array uniqueItems: true description: Array of user ids items: type: integer example: 0 taskIds: type: array uniqueItems: true description: Array of task ids items: type: integer example: 0 default: 0 tagIds: type: array uniqueItems: true description: Array of tag ids items: type: integer example: 0 required: - startDate - endDate examples: 'Example #1': value: startDate: '2022-01-01' endDate: '2022-01-31' 'Example #2': value: startDate: '2022-01-01' endDate: '2022-01-31' userIds: - 1 - 2 - 3 taskIds: - 1 - 10 tagIds: - 5 responses: '200': description: OK response content: application/json: schema: type: array description: Array of time entry objects minItems: 0 uniqueItems: true x-examples: example-1: - id: 1 duration: 4210 invoice_id: 0 last_modify: '2022-01-01 14:28:30' date: '2022-01-01' start_time: '10:54' end_time: '12:28' billable: true description: null user: id: 1 email: john.doe@timecamp.com display_name: John Doe task: id: 1 name: First task color: '#4DC2E8' billable: true tags: [] items: type: object description: Time entry object properties: id: type: integer description: Entry id example: 1 format: int32 duration: type: integer description: Duration in seconds format: int32 example: 300 invoice_id: type: integer description: Invoice id format: int32 example: 1 last_modify: type: string format: date-time example: '2022-01-01 10:05:00' description: Last modify date date: type: string format: date example: '2022-01-01' description: Time entry date start_time: type: string example: '15:00' description: Start time end_time: type: string description: End time example: '16:00' billable: type: boolean description: Is billable description: type: string description: Time entry description nullable: true user: type: object description: Related user data nullable: true properties: id: type: integer description: User id example: 1 email: type: string description: User email example: john.doe@example.com display_name: type: string description: User display name example: John Doe task: type: object description: Related task data nullable: true properties: id: type: number description: Task id example: 1 name: type: string description: Task name example: My task color: type: string description: Task color example: '#000000' billable: type: boolean description: Task is billable tags: type: array description: Related tags data items: type: object properties: id: type: integer description: Tag id example: 1 name: type: string description: Tag name example: My first tag tag_list: type: object properties: id: type: integer description: Tag list id example: 1 name: type: string description: Tag list name example: Tag list required: - id - duration - invoice_id - last_modify - date - start_time - end_time - billable - user - task - tags examples: 'Example #1': value: - id: 1 duration: 4210 invoice_id: 0 last_modify: '2022-01-01 14:28:30' date: '2022-01-01' start_time: '10:54' end_time: '12:28' billable: true description: null user: id: 1 email: john.doe@timecamp.com display_name: John Doe task: id: 1 name: First task color: '#4DC2E8' billable: true tags: - id: 1 name: My first tag tag_list: id: 1 name: My tag list 'Example #2': value: - id: 2 duration: 900 invoice_id: 0 last_modify: '2022-01-01 16:00:00' date: '2022-01-01' start_time: '13:00' end_time: '13:15' billable: true description: null user: id: 1 email: john.doe@timecamp.com display_name: John Doe task: null tags: [] 'Example #3': value: [] headers: Content-Type: schema: type: string description: application/json tags: - '[v3] Time Entry' parameters: [] /v3/time-entries/list: post: operationId: tc2--get--time--entries-list description: Get time entries by user access and permissions. summary: Get time entries by user permissions security: - api_key_in_header: [] requestBody: content: application/json: schema: description: '' type: object x-examples: example-1: startDate: '2021-12-01' endDate: '2022-01-31' userIds: - 640 - 1961631 taskIds: - 85753039 tagIds: - 1 properties: startDate: type: string description: Start date format: date example: '2022-01-01' endDate: type: string description: End date format: date example: '2022-01-31' userIds: type: array uniqueItems: true description: Array of user ids items: type: integer example: 0 taskIds: type: array uniqueItems: true description: Array of task ids items: type: integer example: 0 default: 0 tagIds: type: array uniqueItems: true description: Array of tag ids items: type: integer example: 0 required: - startDate - endDate examples: 'Example #1': value: startDate: '2022-01-01' endDate: '2022-01-31' 'Example #2': value: startDate: '2022-01-01' endDate: '2022-01-31' userIds: - 1 - 2 - 3 taskIds: - 1 - 10 tagIds: - 5 responses: '200': description: OK response content: application/json: schema: type: array description: Array of time entry objects minItems: 0 uniqueItems: true x-examples: example-1: - id: 1 duration: 4210 invoice_id: 0 last_modify: '2022-01-01 14:28:30' date: '2022-01-01' start_time: '10:54' end_time: '12:28' billable: true description: null user: id: 1 email: john.doe@timecamp.com display_name: John Doe task: id: 1 name: First task color: '#4DC2E8' billable: true tags: [] items: type: object description: Time entry object properties: id: type: integer description: Entry id example: 1 format: int32 duration: type: integer description: Duration in seconds format: int32 example: 300 invoice_id: type: integer description: Invoice id format: int32 example: 1 last_modify: type: string format: date-time example: '2022-01-01 10:05:00' description: Last modify date date: type: string format: date example: '2022-01-01' description: Time entry date start_time: type: string example: '15:00' description: Start time end_time: type: string description: End time example: '16:00' billable: type: boolean description: Is billable description: type: string description: Time entry description nullable: true user: type: object description: Related user data nullable: true properties: id: type: integer description: User id example: 1 email: type: string description: User email example: john.doe@example.com display_name: type: string description: User display name example: John Doe task: type: object description: Related task data nullable: true properties: id: type: number description: Task id example: 1 name: type: string description: Task name example: My task color: type: string description: Task color example: '#000000' billable: type: boolean description: Task is billable tags: type: array description: Related tags data items: type: object properties: id: type: integer description: Tag id example: 1 name: type: string description: Tag name example: My first tag tag_list: type: object properties: id: type: integer description: Tag list id example: 1 name: type: string description: Tag list name example: Tag list required: - id - duration - invoice_id - last_modify - date - start_time - end_time - billable - user - task - tags examples: 'Example #1': value: - id: 1 duration: 4210 invoice_id: 0 last_modify: '2022-01-01 14:28:30' date: '2022-01-01' start_time: '10:54' end_time: '12:28' billable: true description: null user: id: 1 email: john.doe@timecamp.com display_name: John Doe task: id: 1 name: First task color: '#4DC2E8' billable: true tags: - id: 1 name: My first tag tag_list: id: 1 name: My tag list 'Example #2': value: - id: 2 duration: 900 invoice_id: 0 last_modify: '2022-01-01 16:00:00' date: '2022-01-01' start_time: '13:00' end_time: '13:15' billable: true description: null user: id: 1 email: john.doe@timecamp.com display_name: John Doe task: null tags: [] 'Example #3': value: [] headers: Content-Type: schema: type: string description: application/json tags: - '[v3] Time Entry' parameters: [] /v3/time-entries/create: post: summary: Create time entry description: Create a time entry. tags: - '[v3] Time Entry' operationId: create-time-entry security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: tc_web in: header name: Tc-service description: Optional service name used for activity and analytics context. requestBody: required: true content: application/json: schema: type: object required: - date properties: date: type: string format: date example: '2026-06-18' startTime: type: string example: '09:00:00' endTime: type: string example: '10:00:00' duration: type: integer format: int32 description: Duration in seconds. If omitted, duration is calculated from start and end. example: 3600 taskId: type: integer format: int32 example: 123 externalTaskId: type: string example: card_123 assignedUserId: type: integer format: int32 example: 456 userEmail: type: string format: email example: user@example.com taskNameSearch: type: string example: Project task note: type: string example: Work note description: type: string example: Work note customId: type: string example: EXT-123 billable: type: boolean example: true tags: type: array items: oneOf: - type: integer - type: object properties: tagId: type: integer baseEntryId: type: integer format: int32 example: 100 place: type: string example: timesheet examples: Create: value: date: '2026-06-18' startTime: '09:00:00' endTime: '10:00:00' taskId: 123 note: Work note billable: true responses: '201': description: Time entry created. content: application/json: schema: type: object properties: data: type: object properties: id: type: integer format: int32 example: 123 duration: type: integer format: int32 example: 3600 userId: type: integer format: int32 example: 456 taskId: type: integer format: int32 example: 123 date: type: string format: date example: '2026-06-18' startTime: type: string example: '09:00:00' endTime: type: string example: '10:00:00' description: type: string nullable: true example: Work note billable: type: boolean example: true tags: type: array nullable: true items: type: integer format: int32 example: 7 meta: type: object properties: tags: type: array description: Tag metadata for tags assigned to the created time entry. items: type: object required: - id - name properties: id: type: integer format: int32 example: 7 name: type: string example: My tag examples: Success Response: value: data: id: 123 duration: 3600 userId: 456 taskId: 123 date: '2026-06-18' startTime: '09:00:00' endTime: '10:00:00' description: Work note billable: true tags: - 7 meta: tags: - id: 7 name: My tag '400': description: Invalid request payload. content: application/json: schema: type: object properties: message: type: string '401': description: Unauthorized. '403': description: Forbidden. content: application/json: schema: type: object properties: message: type: string /v3/time-entries/{id}: put: summary: Update time entry description: Update a time entry by id. tags: - '[v3] Time Entry' operationId: update-time-entry security: - api_key_in_header: [] parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: tc_web in: header name: Tc-service description: Optional service name used for activity and analytics context. - schema: type: integer minimum: 1 example: 123 in: path required: true name: id description: Time entry id. requestBody: required: true content: application/json: schema: type: object minProperties: 1 properties: date: type: string format: date example: '2026-06-18' startTime: type: string example: '09:00:00' endTime: type: string example: '10:00:00' duration: type: integer format: int32 description: Duration in seconds. example: 3600 increase: type: boolean description: When true, adds duration to the current time entry duration instead of replacing it. example: false note: type: string description: Time entry note. Takes precedence over description when both are provided. example: Updated work note description: type: string description: Time entry description. Used when note is not provided. example: Updated work note billable: type: boolean example: true invoiceId: type: integer format: int32 example: 44 taskId: type: integer format: int32 example: 123 analyticsPlace: type: string example: report_detailed analyticsElement: type: string example: duration examples: Update: value: date: '2026-06-18' startTime: '09:00:00' endTime: '10:00:00' duration: 3600 increase: false taskId: 123 note: Updated work note billable: true responses: '200': description: Time entry updated successfully. content: application/json: schema: type: object properties: data: type: object additionalProperties: true properties: entry_id: type: integer format: int32 example: 123 task_id: type: integer format: int32 example: 456 time_span: type: integer format: int32 description: Duration in seconds. example: 3600 user_id: type: integer format: int32 example: 789 date: type: string format: date example: '2026-06-18' start_time_hour: type: string example: '09:00:00' end_time_hour: type: string example: '10:00:00' note: type: string nullable: true example: Updated work note billable: type: boolean example: true invoiceId: type: integer format: int32 example: 44 color: type: string nullable: true example: '#4DC2E8' tags: type: array items: type: integer format: int32 example: 7 meta: type: object properties: tags: type: array description: Tag metadata for tags assigned to the updated time entry. items: type: object required: - id - name properties: id: type: integer format: int32 example: 7 name: type: string example: My tag examples: Success Response: value: data: entry_id: 123 task_id: 456 time_span: 3600 user_id: 789 date: '2026-06-18' start_time_hour: '09:00:00' end_time_hour: '10:00:00' note: Updated work note billable: true invoiceId: 44 color: '#4DC2E8' tags: - 7 meta: tags: - id: 7 name: My tag '400': description: Invalid request payload. content: application/json: schema: type: object properties: message: type: string examples: Bad Request: value: message: unrecognized date or time format '401': description: Unauthorized. '403': description: Forbidden. content: application/json: schema: type: object properties: message: type: string examples: Forbidden: value: message: You do not have permission to update this time entry. '404': description: Time entry not found. content: application/json: schema: type: object properties: message: type: string examples: Not Found: value: message: No entry found x-internal: false delete: summary: Delete time entry description: Delete a time entry by id. tags: - '[v3] Time Entry' operationId: delete-time-entry parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: tc_web in: header name: Tc-service description: Optional service name used for activity and analytics context. - schema: type: integer minimum: 1 example: 123 in: path required: true name: id description: Time entry id. - schema: type: string example: report_detailed in: query required: false name: source description: Optional UI source for analytics context. - schema: type: string example: tracked_time in: query required: false name: element description: Optional UI element for analytics context. responses: '200': description: Time entry deleted successfully content: application/json: schema: type: object properties: message: type: string example: removed examples: Success Response: value: message: removed '204': description: Time entry does not exist or was already deleted. '400': description: Bad Request '401': description: Unauthorized '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: Forbidden: value: message: You do not have permission to delete this time entry. x-internal: false security: - api_key_in_header: [] /v3/time-entry-restriction/list: post: summary: List restrictions operationId: post-time-entry-restriction-list responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object properties: id: type: integer restrictionType: type: string restrictedEntityType: type: string restrictedEntityId: type: integer rootGroupId: type: integer endDate: type: string getRestrictionApplyOffset: type: integer pagination: type: object properties: page: type: integer limit: type: integer total: type: integer x-examples: Example 1: data: - id: 1 restrictionType: customPeriod restrictedEntityType: group restrictedEntityId: 1208 rootGroupId: 1208 endDate: '2023-12-06T00:00:00+01:00' getRestrictionApplyOffset: 1 - id: 2 restrictionType: customPeriod restrictedEntityType: group restrictedEntityId: 1208 rootGroupId: 1208 endDate: '2023-12-05T00:00:00+01:00' getRestrictionApplyOffset: 0 - id: 3 restrictionType: customPeriod restrictedEntityType: group restrictedEntityId: 1208 rootGroupId: 1208 endDate: '2023-12-05T00:00:00+01:00' getRestrictionApplyOffset: 0 - id: 4 restrictionType: customPeriod restrictedEntityType: group restrictedEntityId: 1208 rootGroupId: 1208 endDate: '2023-12-05T00:00:00+01:00' getRestrictionApplyOffset: 0 pagination: page: 1 limit: 10 total: 4 description: List all time entry restriction filtered by given params. An additional setting must be enabled for this endpoint to work - please contact support if you would like us to enable it. requestBody: description: '' content: application/json: schema: type: object properties: restrictionType: enum: - customPeriod restrictedEntityType: enum: - group restrictedEntityId: type: integer page: type: integer description: default 1 limit: type: number description: default 10 restrictionData: type: object minProperties: 0 description: You have to specify restrictionType to set additional filters properties: fromEndDate: type: string description: only in ``customPeriod`` restrictionType pattern: YYYY-mm-dd example: '2023-06-06' toEndDate: type: string pattern: YYYY-mm-dd example: '2023-06-06' description: only in ``customPeriod`` restrictionType tags: - '[v3] Time Entry Restriction' security: - api_key_in_header: [] parameters: [] /v3/time-entry-restriction: post: summary: Create Time Entry restriction description: Create specific restriction. An additional setting must be enabled for this endpoint to work - please contact support if you would like us to enable it. operationId: post-time-entry-restriction responses: '200': description: OK '403': description: Forbidden requestBody: content: application/json: schema: type: object properties: restrictionType: enum: - customPeriod restrictedEntityType: enum: - group restrictedEntityId: type: integer restrictionData: type: object properties: endDate: type: string description: only in ``customPeriod`` restrictionType, tells, about date till which entries won't be allowed to be modified, required in this restrictionType pattern: YYYY-mm-dd restrictionApplyOffset: type: number description: only in ``customPeriod`` restrictionType, tells, how much days timesheet is available to modifying after endDate required in this restrictionType required: - restrictionType - restrictedEntityType - restrictedEntityId - restrictionData tags: - '[v3] Time Entry Restriction' parameters: [] security: - api_key_in_header: [] /v3/time-entry-restriction/{id}: delete: summary: Delete Time Entry restriction operationId: delete-time-entry-restriction responses: '200': description: OK '403': description: Forbidden parameters: [] description: Delete specific restriction. If you don't know id of restriction you want to delete see time-entry-restriction/list endpoint. An additional setting must be enabled for this endpoint to work - please contact support if you would like us to enable it. tags: - '[v3] Time Entry Restriction' security: - api_key_in_header: [] parameters: - schema: type: number name: id in: path required: true /v3/activity-category/{id}: parameters: - schema: type: integer example: 245 name: id in: path required: true description: Activity category identifier. /v3/activity-category/{groupId}/productivity: parameters: - schema: type: integer example: 56 name: groupId in: path required: true description: Group identifier from the current user's root group tree. /v3/activity-category/{groupId}/applications: parameters: - schema: type: integer example: 56 name: groupId in: path required: true description: Group identifier from the current user's root group tree. /v3/activity-category/{groupId}/applications/search: parameters: - schema: type: integer example: 56 name: groupId in: path required: true description: Group identifier from the current user's root group tree. /v3/activity-category/{groupId}/applications/restore-default: parameters: - schema: type: integer example: 56 name: groupId in: path required: true description: Group identifier from the current user's root group tree. /v3/activity-category/{groupId}/productivity/restore-default: parameters: - schema: type: integer example: 56 name: groupId in: path required: true description: Group identifier from the current user's root group tree. /v3/expense/category/{id}: put: description: ' ' summary: Update expense category operationId: put-expense-category responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: message: ok data: id: 50 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-10-23 16:06:01' updatedAt: '2023-10-27 08:24:07' properties: message: type: string data: $ref: '#/components/schemas/Expense-category-response' examples: Example 1: value: message: ok data: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null security: - api_key_in_header: [] requestBody: content: application/json: schema: $ref: '#/components/schemas/Expense-category-request' examples: Example 1: value: name: My category color: '#4DC2E8' currencyId: 2 unitPrice: 1000 unitName: my unit x-internal: false tags: - '[v3] Expense' parameters: - schema: type: string example: '50' name: id in: path required: true /v3/expense/category: get: summary: List expense category tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/Expense-category-response' examples: Example 1: value: - id: 50 rootGroupId: 12345 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-08-29 16:58:56' updatedAt: 'null' headers: {} operationId: get-expense-category security: - api_key_in_header: [] x-internal: false post: summary: Create expense category operationId: post-expense-category responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: message: ok data: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-10-27 08:26:34' updatedAt: null properties: message: type: string data: $ref: '#/components/schemas/Expense-category-response' description: ' ' parameters: [] security: - api_key_in_header: [] requestBody: content: application/json: schema: $ref: '#/components/schemas/Expense-category-request' examples: Example 1: value: name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 x-internal: false tags: - '[v3] Expense' /v3/available-plans: parameters: [] /v3/expense/category/{id}/archive: patch: summary: Archive expense category tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: ok examples: Example 1: value: message: ok operationId: patch-expense-category-43-archive x-internal: false security: - api_key_in_header: [] parameters: - schema: type: string example: '50' name: id in: path required: true /v3/expense/list: get: summary: List expense tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: data: [] pagination: totalItemQuantity: 0 page: 1 limit: 25 metadata: totalAmount: 0 properties: data: type: array items: $ref: '#/components/schemas/Expense-response' pagination: type: object properties: totalItemQuantity: type: integer page: type: integer limit: type: integer metadata: type: object properties: totalAmount: type: integer examples: Example 1: value: data: - id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 128 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 512 updatedBy: null createdAt: '2023-10-17 09:41:33' updatedAt: null - id: 75 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 256 amount: 2000 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 14:33:47' createdBy: 512 updatedBy: null createdAt: '2023-10-17 19:33:23' updatedAt: null pagination: totalItemQuantity: 2 page: 1 limit: 25 metadata: totalAmount: 4522 operationId: get-expense-list x-internal: false parameters: - schema: type: string in: query name: timeFrameStart - schema: type: string in: query name: timeFrameEnd - schema: type: array items: type: integer in: query name: taskIds - schema: type: array items: type: integer in: query name: expenseCategoryIds - schema: type: integer in: query name: invoiced - schema: type: boolean in: query name: billable - schema: type: integer in: query name: invoiceId - schema: type: string default: desc in: query name: sortOrder - schema: type: string default: made_at in: query name: sortBy - schema: type: integer default: 25 in: query name: limit - schema: type: integer default: 1 in: query name: page security: - api_key_in_header: [] post: summary: List expense tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: data: [] pagination: totalItemQuantity: 0 page: 1 limit: 25 metadata: totalAmount: 0 properties: data: type: array items: $ref: '#/components/schemas/Expense-response' pagination: type: object properties: totalItemQuantity: type: integer page: type: integer limit: type: integer metadata: type: object properties: totalAmount: type: integer examples: Example 1: value: data: - id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 128 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 512 updatedBy: null createdAt: '2023-10-17 09:41:33' updatedAt: null - id: 75 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 256 amount: 2000 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 14:33:47' createdBy: 512 updatedBy: null createdAt: '2023-10-17 19:33:23' updatedAt: null pagination: totalItemQuantity: 2 page: 1 limit: 25 metadata: totalAmount: 4522 operationId: post-expense-list x-internal: false requestBody: content: application/json: schema: type: object x-examples: Example 1: timeFrameStart: '2023-09-01' timeFrameEnd: '2023-10-31' taskIds: - 1 - 2 expenseCategoryIds: - 1 - 2 invoiced: true billable: true invoiceId: 1 sortOrder: asc sortBy: madeAt properties: timeFrameStart: type: string nullable: true timeFrameEnd: type: string nullable: true taskIds: type: array nullable: true items: {} expenseCategoryIds: type: array nullable: true items: {} invoiced: type: boolean nullable: true billable: type: boolean nullable: true invoiceId: type: integer nullable: true sortOrder: type: string default: desc nullable: true sortBy: type: string default: made_at nullable: true limit: type: number default: 1 page: type: number default: 25 examples: Example 1: value: timeFrameStart: '2023-09-01' timeFrameEnd: '2023-10-31' taskIds: - 128 - 256 expenseCategoryIds: - 74 - 75 invoiced: false billable: true invoiceId: null sortOrder: asc sortBy: madeAt limit: 25 page: 1 security: - api_key_in_header: [] /v3/expense: post: summary: Create expense tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Expense-response' examples: Example 1: value: message: ok data: id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 512 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 256 updatedBy: 256 createdAt: '2023-10-21 09:41:33' updatedAt: '2023-10-21 09:41:41' operationId: post-expense security: - api_key_in_header: [] x-internal: false requestBody: content: application/json: schema: $ref: '#/components/schemas/Expense-request' examples: Example 1: value: currencyId: 2 expenseCategoryId: '50' taskId: 512 amount: 2522 description: My description... isBillable: true madeBy: 256 madeAt: '2023-09-12 10:32:22' /v3/expense/{id}: put: summary: Update expense tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Expense-response' examples: Example 1: value: message: ok data: id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 512 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 256 updatedBy: 256 createdAt: '2023-10-21 09:41:33' updatedAt: '2023-10-21 09:41:41' operationId: put-expesne x-internal: false security: - api_key_in_header: [] requestBody: content: application/json: schema: $ref: '#/components/schemas/Expense-request' examples: Example 1: value: currencyId: 2 expenseCategoryId: '50' taskId: 512 amount: 2522 description: My description... isBillable: true madeBy: 256 madeAt: '2023-09-12 10:32:22' delete: summary: Delete expense tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: ok examples: Example 1: value: message: ok operationId: delete-expesne security: - api_key_in_header: [] x-internal: false parameters: - schema: type: string example: '74' name: id in: path required: true /v3/expense/{id}/attachment/upload: parameters: - schema: type: string example: '74' name: id in: path required: true post: summary: Upload expense attachment tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: message: ok data: - id: 14 userFilename: 02.pdf mimeType: application/pdf url: /internal/api/v3/storage/download/14 properties: message: type: string data: type: array items: $ref: '#/components/schemas/Attachment' examples: Example 1: value: message: ok data: - id: 14 userFilename: 02.pdf mimeType: application/pdf url: /internal/api/v3/storage/download/14 operationId: post-expense-id-attachment-upload x-internal: false security: - api_key_in_header: [] requestBody: content: multipart/form-data: schema: type: object properties: file: type: string format: binary description: '' /v3/expense/{id}/attachment: parameters: - schema: type: string example: '74' name: id in: path required: true get: summary: Get expense attachment tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: message: ok data: - id: 14 userFilename: 02.pdf mimeType: application/pdf url: /internal/api/v3/storage/download/14 properties: message: type: string data: type: array items: $ref: '#/components/schemas/Attachment' examples: Example 1: value: message: ok data: - id: 14 userFilename: 02.pdf mimeType: application/pdf url: /internal/api/v3/storage/download/14 operationId: get-expense-id-attachment x-internal: false security: - api_key_in_header: [] /v3/expense/{id}/attachment/{id_attachment}/delete: parameters: - schema: type: string example: '74' name: id in: path required: true - schema: type: string example: '14' name: id_attachment in: path required: true delete: summary: Delete expense attachment tags: - '[v3] Expense' responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string x-examples: Example 1: message: ok examples: Example 1: value: message: ok operationId: delete-expense-id-attachment-id_attachment-delete x-internal: false security: - api_key_in_header: [] /v3/expense/invoice/unassign: put: summary: Invoice unassign from expense tags: - '[v3] Expense' - '[v3] Invoices' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: message: ok data: - id: 74 currencyId: 2 expenseCategory: id: 50 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-10-23 16:06:01' updatedAt: '2023-10-27 09:18:31' taskId: 868 amount: 2522 description: ABCD status: 0 isBillable: true invoiceId: null madeBy: 640 madeAt: '2023-09-12 10:32:22' createdBy: 640 updatedBy: 640 createdAt: '2023-10-27 09:41:33' updatedAt: '2023-10-27 09:47:51' properties: message: type: string data: type: array items: type: object properties: id: type: integer currencyId: type: integer expenseCategory: $ref: '#/components/schemas/Expense-response' taskId: type: integer amount: type: integer description: type: string status: type: integer isBillable: type: boolean invoiceId: type: integer nullable: true madeBy: type: integer madeAt: type: string createdBy: type: integer updatedBy: type: integer createdAt: type: string updatedAt: type: string examples: Example 1: value: message: ok data: id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 512 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 256 updatedBy: 256 createdAt: '2023-10-21 09:41:33' updatedAt: '2023-10-21 09:41:41' operationId: put-expense-invoice-unassign x-internal: false security: - api_key_in_header: [] requestBody: content: application/json: schema: type: object properties: expenseIds: type: array items: type: integer x-examples: Example 1: expenseIds: - 45 - 46 examples: Example 1: value: expenseIds: - 45 - 46 /v3/expense/invoice/assign: put: summary: Invoice assign to expense tags: - '[v3] Expense' - '[v3] Invoices' responses: '200': description: OK content: application/json: schema: type: object x-examples: Example 1: message: ok data: id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 512 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 256 updatedBy: 256 createdAt: '2023-10-21 09:41:33' updatedAt: '2023-10-21 09:41:41' properties: message: type: string data: $ref: '#/components/schemas/Expense-response' examples: Example 1: value: message: ok data: id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 512 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: 236 madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 256 updatedBy: 256 createdAt: '2023-10-21 09:41:33' updatedAt: '2023-10-21 09:41:41' operationId: put-expense-invoice-assign security: - api_key_in_header: [] x-internal: false requestBody: content: application/json: schema: type: object properties: invoiceId: type: integer expenseIds: type: array items: type: integer x-examples: Example 1: invoiceId: 236 expenseIds: - 45 - 46 examples: Example 1: value: invoiceId: 236 expenseIds: - 45 - 46 /v3/pivot/tabs/{id}: parameters: - schema: type: integer example: 1 name: id in: path required: true /v3/storage/download/{id}: parameters: - schema: type: string example: '15' name: id in: path required: true get: summary: Storage get file tags: - '[v3] Storage' responses: '200': description: Successful file download content: application/octet-stream: schema: type: string format: binary examples: exampleFile: summary: Example file download value: Binary file content operationId: get-storage-download-id security: - api_key_in_header: [] /v3/storage/file/list/root-group: get: summary: Get the list of files from the user's main group tags: - '[v3] Storage' parameters: - name: createdFrom in: query schema: type: string format: date-time description: Optional timestamp from which files are searched. ISO 8601 format - name: createdTo in: query schema: type: string format: date-time description: Optional timestamp to which files are searched. ISO 8601 format responses: '200': description: List of files in the main group content: application/json: schema: type: object properties: files: type: array items: type: object properties: userId: type: integer description: Identifier of owner of the file name: type: string description: File Identifier. createdAt: type: string format: date-time description: File creation time. lastModifiedAt: type: string format: date-time description: File last modification time '403': description: Access denied, the user does not have the appropriate permissions. content: application/json: schema: type: object properties: message: type: string example: Operation forbidden '500': description: Server error while retrieving the file list. content: application/json: schema: type: object properties: message: type: string example: There was an internal error while trying to fetch the list of files. operationId: get-storage-file-root-group security: - api_key_in_header: [] /v3/module/core: parameters: [] /v3/module/user: parameters: [] /v3/module/dependencies/{module}: parameters: - schema: type: string name: module in: path required: true /v3/remote-work-detection/{id}/update: parameters: - schema: type: string name: id in: path required: true /v3/remote-work-detection/{id}/remove: parameters: - schema: type: string name: id in: path required: true /v3/remote-work-detection/{ip_address}/check: parameters: - schema: type: string name: ip_address in: path required: true /v3/activity-log/sites-and-apps: post: summary: List of sites and apps responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object properties: name: type: string time: type: string description: Format according to settings time_seconds: type: integer time_percentage: type: integer category: type: string productivity: type: integer type: type: string description: 'One of: apps, www, offline' application_id: type: integer category_id: type: integer operationId: post-activity-log-sites-and-apps requestBody: content: application/json: schema: type: object required: - startDate - endDate properties: startDate: type: string format: date example: '2025-03-01' endDate: type: string format: date example: '2025-03-31' userIds: type: array uniqueItems: true description: If not provided, the details of the user executing the request are returned. items: type: integer tags: - '[v3] Computer Activities' security: - api_key_in_header: [] /v3/custom-fields/template/list: get: summary: List Custom Field Templates description: List Custom Field Templates tags: - '[v3] Custom Fields' operationId: get-custom-fields-template-list parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type responses: '200': description: List of active custom fields templates content: application/json: schema: type: object properties: data: type: array items: properties: id: type: integer description: ID of the created template name: type: string description: Name of the template resourceType: type: string description: Resource type required: type: boolean description: Whether the field is required status: type: integer description: Template status fieldType: type: string description: Field type defaultValue: type: string nullable: true description: Default value fieldOptions: type: array nullable: true description: Field options items: type: object examples: Success Response: value: data: - id: 15 name: Customer Priority resourceType: user required: true status: 1 fieldType: string defaultValue: Medium fieldOptions: [] - id: 16 name: Customer Category resourceType: user required: false status: 1 fieldType: string defaultValue: null fieldOptions: [] '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/template/create: post: summary: Create Custom Field Template description: Create Custom Field Template tags: - '[v3] Custom Fields' operationId: post-custom-fields-template-create parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - name - resourceType - fieldType properties: name: type: string description: Name of the custom field template example: Customer Priority resourceType: type: string description: Key of the resource type this template applies to enum: - user - task - entry example: user required: type: boolean description: Whether this field is required default: false example: true status: type: integer description: Status of the template example: 0 fieldType: type: string description: Type of the custom field enum: - number - string example: number defaultValue: type: string nullable: true description: Default value for the field (must match field type), must be provided if field is required example: Medium fieldOptions: type: array nullable: true description: Configuration options for the field items: type: object example: [] examples: Text Field Example: value: name: Customer Notes resourceType: user required: false status: 0 fieldType: string defaultValue: '' fieldOptions: [] Required Number Field: value: name: Priority Score resourceType: task required: true status: 0 fieldType: number defaultValue: '5' fieldOptions: [] responses: '200': description: Custom field template created successfully content: application/json: schema: type: object properties: data: type: object properties: id: type: integer description: ID of the created template name: type: string description: Name of the template resourceType: type: string description: Resource type required: type: boolean description: Whether the field is required status: type: integer description: Template status fieldType: type: string description: Field type defaultValue: type: string nullable: true description: Default value fieldOptions: type: array nullable: true description: Field options items: type: object examples: Success Response: value: data: id: 15 name: Customer Priority resourceType: user required: true status: 1 fieldType: text defaultValue: Medium fieldOptions: [] '400': description: Bad Request - Validation errors content: application/json: schema: type: object properties: errors: type: array items: type: object properties: field: type: string message: type: string examples: Validation Error: value: errors: - field: name message: This value should not be blank. - field: fieldType message: Choose a valid type '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/template/{templateId}/modify: put: summary: Modify Custom Field Template description: Modify Custom Field Template tags: - '[v3] Custom Fields' operationId: put-custom-fields-template-modify parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: templateId requestBody: required: true content: application/json: schema: type: object properties: name: type: string description: Name of the custom field template example: Customer Priority required: type: boolean description: Whether this field is required default: false example: true status: type: integer description: Status of the template example: 0 defaultValue: type: string nullable: true description: Default value for the field (must match field type), must be provided if field is required example: Medium fieldOptions: type: array nullable: true description: Configuration options for the field items: type: object example: [] examples: Text Field Example: value: name: Customer Notes required: false status: 0 defaultValue: '' fieldOptions: [] Required Number Field: value: name: Priority Score required: true status: 0 defaultValue: '5' fieldOptions: [] responses: '200': description: Custom field template modified successfully content: application/json: schema: type: object properties: data: type: object properties: id: type: integer description: ID of the created template name: type: string description: Name of the template resourceType: type: string description: Resource type required: type: boolean description: Whether the field is required status: type: integer description: Template status fieldType: type: string description: Field type defaultValue: type: string nullable: true description: Default value fieldOptions: type: array nullable: true description: Field options items: type: object examples: Success Response: value: data: id: 15 name: Customer Priority resourceType: user required: true status: 1 fieldType: text defaultValue: Medium fieldOptions: [] '400': description: Bad Request - Validation errors content: application/json: schema: type: object properties: errors: type: array items: type: object properties: field: type: string message: type: string examples: Validation Error: value: errors: - field: defaultValue message: 'Value NULL is not valid for this field (Type: number, Required: true)' '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/template/{templateId}/remove: delete: summary: Remove Custom Field Template description: Remove Custom Field Template tags: - '[v3] Custom Fields' operationId: delete-custom-fields-template-remove parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: templateId responses: '200': description: Custom field template removed successfully content: application/json: schema: type: object properties: data: type: string examples: Success Response: value: data: ok '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/{templateId}/assign/{resourceId}: post: summary: Assign value to custom fields description: Assign value to custom fields tags: - '[v3] Custom Fields' operationId: post-custom-fields-resource-assign parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: templateId - schema: type: integer example: 1 in: path required: true name: resourceId requestBody: required: true content: application/json: schema: type: object required: - value properties: value: type: string description: New value for this custom field in a resource example: In Progress examples: Assigned Value: value: value: In Progress responses: '200': description: Custom field value assigned successfully content: application/json: schema: type: object properties: data: type: object properties: id: type: integer description: Unique identifier for the custom field assignment example: 66 resourceId: type: integer description: ID of the resource this custom field is assigned to example: 610 resourceType: type: string description: Type of the resource example: user required: type: boolean description: Whether this custom field is required example: true value: type: string description: The assigned value for this custom field example: In Progress fieldType: type: string description: Type of the custom field example: string startDate: type: string format: date-time description: Start date for the custom field assignment example: '2025-07-08 10:45:15' endDate: type: string format: date-time nullable: true description: End date for the custom field assignment (null means it's active value, date is for values in the past) example: null createdBy: type: integer description: ID of the user who created this assignment example: 610 createdAt: type: string format: date-time description: DateTime when the assignment was created example: '2025-07-08 10:45:15' updatedAt: type: string format: date-time description: DateTime when the assignment was last updated example: '2025-07-08 10:45:15' examples: Success Response: value: data: id: 66 resourceId: 610 resourceType: user required: true value: In Progress fieldType: string startDate: '2025-07-08 10:45:15' endDate: null createdBy: 610 createdAt: '2025-07-08 10:45:15' updatedAt: '2025-07-08 10:45:15' '400': description: Bad Request - Validation errors content: application/json: schema: type: object properties: errors: type: array items: type: object properties: field: type: string message: type: string examples: Validation Error: value: errors: - field: value message: 'Value NULL is not valid for this field (Type: number, Required: true)' '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/{templateId}/unassign/{resourceId}: delete: summary: Unassign value from custom fields description: Unassign value from custom fields tags: - '[v3] Custom Fields' operationId: delete-custom-fields-resource-unassign parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: templateId - schema: type: integer example: 1 in: path required: true name: resourceId responses: '200': description: Custom field value was unassigned successfully content: application/json: schema: type: object properties: data: type: object properties: id: type: integer description: Unique identifier for the custom field assignment example: 66 resourceId: type: integer description: ID of the resource this custom field is assigned to example: 610 resourceType: type: string description: Type of the resource example: user required: type: boolean description: Whether this custom field is required example: true value: type: string description: The assigned value for this custom field example: In Progress fieldType: type: string description: Type of the custom field example: string startDate: type: string format: date-time description: Start date for the custom field assignment example: '2025-07-08 10:45:15' endDate: type: string format: date-time nullable: true description: End date for the custom field assignment (null means it's active value, date is for values in the past) example: '2025-07-08 12:45:15' createdBy: type: integer description: ID of the user who created this assignment example: 610 createdAt: type: string format: date-time description: DateTime when the assignment was created example: '2025-07-08 10:45:15' updatedAt: type: string format: date-time description: DateTime when the assignment was last updated example: '2025-07-08 10:45:15' examples: Success Response: value: data: id: 66 resourceId: 610 resourceType: user required: true value: In Progress fieldType: string startDate: '2025-07-08 10:45:15' endDate: '2025-07-08 12:45:15' createdBy: 610 createdAt: '2025-07-08 10:45:15' updatedAt: '2025-07-08 10:45:15' '400': description: Bad Request - Validation errors content: application/json: schema: type: object properties: errors: type: array items: type: object properties: field: type: string message: type: string examples: Validation Error: value: errors: - field: value message: 'Value NULL is not valid for this field (Type: number, Required: true)' '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/{templateId}/value/{resourceId}: get: summary: Retrieve value for custom field in resource description: Retrieve value for custom field in resource tags: - '[v3] Custom Fields' operationId: get-custom-fields-resource-value parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: templateId - schema: type: integer example: 1 in: path required: true name: resourceId responses: '200': description: Value of the custom field content: application/json: schema: type: object properties: data: type: object properties: id: type: integer description: Unique identifier for the custom field assignment example: 66 resourceId: type: integer description: ID of the resource this custom field is assigned to example: 610 resourceType: type: string description: Type of the resource example: user required: type: boolean description: Whether this custom field is required example: true value: type: string description: The assigned value for this custom field example: In Progress fieldType: type: string description: Type of the custom field example: string startDate: type: string format: date-time description: Start date for the custom field assignment example: '2025-07-08 10:45:15' endDate: type: string format: date-time nullable: true description: End date for the custom field assignment (null means it's active value, date is for values in the past) example: null createdBy: type: integer description: ID of the user who created this assignment example: 610 createdAt: type: string format: date-time description: DateTime when the assignment was created example: '2025-07-08 10:45:15' updatedAt: type: string format: date-time description: DateTime when the assignment was last updated example: '2025-07-08 10:45:15' examples: Success Response: value: data: id: 66 resourceId: 610 resourceType: user required: true value: In Progress fieldType: string startDate: '2025-07-08 10:45:15' endDate: null createdBy: 610 createdAt: '2025-07-08 10:45:15' updatedAt: '2025-07-08 10:45:15' '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/custom-fields/values/resource/{resourceId}/type/{resourceType}: get: summary: Retrieve values for all custom fields in resource description: Retrieve values for all custom fields in resource tags: - '[v3] Custom Fields' operationId: get-custom-fields-resource-values parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: string example: user in: path required: true name: resourceType - schema: type: integer example: 1 in: path required: true name: resourceId responses: '200': description: Custom Fields values for the resource content: application/json: schema: type: object properties: data: type: array items: properties: templateId: type: integer description: ID of the Custom Field template this value corresponds to example: 66 name: type: string description: Name of the Custom Field Template example: Client Status resourceType: type: string description: Type of the resource example: user required: type: boolean description: Whether this custom field value is required example: true fieldType: type: string description: Type of the custom field example: string defaultValue: type: string description: Default value for this Custom Field if none was provided and field is required example: In Progress value: type: string description: The assigned value for this custom field (if field is required and there was no assignment yet it'll show defaultValue) example: In Progress examples: Success Response: value: data: - templateId: 66 name: Client Status resourceType: user required: true fieldType: string defaultValue: In Progress value: In Progress - templateId: 69 name: Progress resourceType: user required: false fieldType: number defaultValue: null value: '75' '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found x-internal: false security: - api_key_in_header: [] /v3/data-export/exports: get: summary: Get exports description: Get exports tags: - '[v3] Data Export' operationId: get-data-export-exports parameters: - name: Accept in: header schema: type: string example: application/json - name: limit in: query schema: type: integer default: 100 - name: page in: query schema: type: integer default: 1 - name: sortBy in: query schema: type: string default: created_at enum: - created_at - id - name: sortOrder in: query schema: type: string default: desc enum: - desc - asc responses: '200': description: Data exports content: application/json: schema: type: object required: - data - pagination properties: data: type: object required: - id - datasets - file_format - from - to - status properties: id: type: integer description: ID of data export datasets: type: array description: Datasets of export items: type: string enum: - computer_activity example: - computer_activity file_format: type: string description: Format of the exported file enum: - csv - xls from: type: string description: Start date of the export example: '2022-01-01' to: type: string description: End date of the export example: '2022-12-31' status: type: string description: Status of data export enum: - created - pending - processing - failed - completed - unstable - disabled pagination: type: object required: - totalItemQuantity - page - limit properties: totalItemQuantity: type: integer description: total count of items page: type: integer description: current results page limit: type: integer description: current limit on the page examples: Success response: value: data: - id: 15 created_at: '2025-05-01 10:00:00' datasets: - computer_activity file_format: csv from: '2025-04-01 07:00:00' to: '2025-04-30 20:00:00' status: failed - id: 16 created_at: '2025-05-01 10:00:00' datasets: - computer_activity file_format: csv from: '2025-03-01 07:00:00' to: '2025-03-31 20:00:00' status: pending pagination: totalItemQuantity: 20 page: 1 limit: 2 '400': description: Invalid request content: application/json: examples: Validation error: value: message: Request validation failed errors: '0': property: limit message: Limit must be greater than 1 value: 0 '401': description: Unauthorized '403': description: Forbidden content: application/json: examples: Invalid permissions: value: message: You are not allowed to get exports security: - api_key_in_header: [] /v3/data-export/open-exports: get: summary: Get open exports description: Get open exports tags: - '[v3] Data Export' operationId: get-data-export-open-exports parameters: - name: Accept in: header schema: type: string example: application/json responses: '200': description: Open data exports content: application/json: schema: type: object required: - data properties: data: type: object required: - id - status properties: id: type: integer description: ID of data export status: type: string description: Status of data export enum: - created - pending - processing examples: Success response: value: data: - id: 15 status: processing - id: 16 status: pending '401': description: Unauthorized '403': description: Forbidden content: application/json: examples: Invalid permissions: value: message: You are not allowed to get open exports security: - api_key_in_header: [] /v3/data-export/export/{exportId}: get: summary: Get export by ID description: Get export by ID tags: - '[v3] Data Export' operationId: get-data-export-id parameters: - name: Accept in: header schema: type: string example: application/json - schema: type: integer name: exportId in: path required: true responses: '200': description: Data export content: application/json: schema: type: object required: - id - status properties: id: type: integer description: ID of data export status: type: string description: Status of data export enum: - created - pending - processing - failed - completed - unstable - disabled examples: Success response: value: id: 16 status: pending '400': description: Invalid request '401': description: Unauthorized '403': description: Forbidden security: - api_key_in_header: [] /v3/data-export/dataset-availability: get: summary: Get list of dataset availability description: Get list of dataset availability tags: - '[v3] Data Export' operationId: get-dataset-availability parameters: - name: Accept in: header schema: type: string example: application/json responses: '200': description: List dataset availability content: application/json: schema: type: object required: - data properties: data: type: array items: properties: dataset: type: string enum: - computer_activity - time_entry isAvailable: type: boolean '401': description: Unauthorized security: - api_key_in_header: [] /v3/export-request: post: summary: Create export request description: Create export request tags: - '[v3] Data Export' operationId: post-export-request parameters: - name: Accept in: header schema: type: string example: application/json - name: Content-Type in: header schema: type: string example: application/json requestBody: required: true content: application/json: schema: type: object required: - from - to - fileFormat - formatterType - datasets properties: from: type: string description: Start date of the export example: '2022-01-01' to: type: string description: End date of the export example: '2022-12-31' fileFormat: type: string description: Format of the exported file enum: - csv - xlsx formatterType: type: string description: Formatter type enum: - default datasets: type: array description: Datasets to export items: type: string enum: - computer_activity - time_entry example: - computer_activity filters: type: array description: Filters to apply to the export items: type: object properties: usePrivileges: type: integer description: Whether to use privileges enum: - 0 - 1 examples: Export request: value: from: '2025-01-01' to: '2025-12-31' fileFormat: csv formatterType: default datasets: - computer_activity - time_entry responses: '200': description: Export requested content: application/json: schema: type: object properties: requestId: type: integer '400': description: Invalid request content: application/json: examples: Invalid permissions: value: message: You are not allowed to create export for provided data sets Internal error: value: message: There was an internal error while trying to save this payload Validation error: value: message: Request validation failed errors: '0': field: fileFormat message: Choose a valid file format '401': description: Unauthorized '403': description: Forbidden security: - api_key_in_header: [] /v3/approval/{resourceId}: get: summary: Get approval description: Get approval by id tags: - '[v3] Approval' operationId: get-approval responses: '200': description: OK content: application/json: schema: type: object properties: data: type: object properties: approvalId: type: integer status: type: integer addTime: type: string approvalTime: type: string modificationTime: type: string approvedBy: type: integer from: type: string to: type: string userId: type: integer projects: type: string rootGroupId: type: integer auto: type: string approvedBy2: type: integer messages: type: array items: type: object properties: id: type: integer approvalId: type: integer userId: type: integer message: type: string event: type: integer addTime: type: string examples: Example 1: value: data: approvalId: 34523534 status: 0 addTime: '2025-06-09 00:00:00' approvalTime: '' modificationTime: '' approvedBy: 0 from: '2025-06-09' to: '2025-06-15' userId: 364263 projects: '' rootGroupId: 264933 auto: '0' approvedBy2: 0 messages: - id: 124234 approvalId: 34523534 userId: 2217515 message: My message event: 0 addTime: '2025-06-09 00:00:00' - id: 124235 approvalId: 34523534 userId: 2217515 message: My other message event: 0 addTime: '2025-06-10 00:00:00' default: description: Default parameters: - schema: type: integer example: 254954325 in: path required: true name: resourceId - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type security: - api_key_in_header: [] /v3/approval/list: post: summary: List approval description: Get approval list by filters tags: - '[v3] Approval' operationId: list-approval parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - from - to properties: from: type: string description: Date of start example: '2025-06-09' to: type: string description: Date of end example: '2025-06-15' userIds: type: array description: List of user IDs to filter example: [] statuses: type: array description: List of approval statuses to filter enum: - 0 - 1 - 2 - 3 - 5 - 6 - 7 example: [] page: type: integer description: Page number for pagination example: 1 limit: type: integer description: Number of items per page example: 25 examples: Example: value: from: '2025-06-09' to: '2025-06-15' userIds: - 23145 statuses: [] page: 1 limit: 25 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object properties: approvalId: type: integer status: type: integer addTime: type: string approvalTime: type: string|null modificationTime: type: string|null approvedBy: type: integer from: type: string to: type: string userId: type: integer projects: type: string rootGroupId: type: integer auto: type: string approvedBy2: type: integer totalTime: type: integer pagination: type: object properties: page: type: integer totalPages: type: integer examples: Example 1: value: data: - approvalId: 34523534 status: 0 addTime: '2025-06-09 00:00:00' approvalTime: '' modificationTime: '2025-06-10 15:24:33' approvedBy: 0 from: '2025-06-09' to: '2025-06-15' userId: 364263 projects: '' rootGroupId: 264933 auto: '0' approvedBy2: 0 totalTime: 1231 pagination: page: 1 totalPages: 5 default: description: Default security: - api_key_in_header: [] /v3/approval/{id}/change-status: put: summary: Change status of approval description: Change status of approval tags: - '[v3] Approval' operationId: change-approval-status parameters: - schema: type: string example: '74356654' name: id in: path required: true - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - status properties: status: type: integer description: | New status: 0 - Open 1 - Approved 2 - Pending 3 - Rejected example: 1 message: type: string description: Comment send in mail example: this is message examples: Example: value: status: 1 message: this is message responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object properties: approvalId: type: integer status: type: integer modificationTime: type: string approvedBy: type: integer approvedBy2: type: integer examples: Example 1: value: data: - approvalId: 34523534 status: 0 modificationTime: '2025-06-09 00:00:00' approvedBy: 234522 approvedBy2: 0 default: description: Default security: - api_key_in_header: [] /v3/approval/bulk-change-status: put: summary: Bulk change status of approval description: Bulk change status of approval tags: - '[v3] Approval' operationId: bulk-change-approval-status parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - approvalIds - status properties: approvalIds: type: array description: Array of approval ids example: - 34523534 - 34535345 status: type: integer description: | New status: 0 - Open 1 - Approved 2 - Pending 3 - Rejected example: 1 examples: Example: value: status: 1 approvalIds: - 34523534 - 34535345 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: object properties: bulkItemsChanged: type: array items: type: object properties: approvalId: type: integer status: type: integer modificationTime: type: string approvedBy: type: integer approvedBy2: type: integer examples: Example 1: value: data: bulkItemsChanged: - approvalId: 34523534 status: 1 modificationTime: '2025-06-09 00:00:00' approvedBy: 234522 approvedBy2: 0 - approvalId: 34535345 status: 1 modificationTime: '2025-06-09 00:00:00' approvedBy: 234522 approvedBy2: 0 default: description: Default security: - api_key_in_header: [] /v3/approval/{id}/activities: post: summary: List approval activities description: Get approval activities by filters tags: - '[v3] Approval' operationId: approval-activity-list parameters: - schema: type: string example: '74356654' name: id in: path required: true - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object properties: page: type: integer description: Page number for pagination example: 1 limit: type: integer description: Number of items per page example: 25 examples: Example: value: page: 1 limit: 25 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object properties: id: type: integer actionTime: type: string userId: type: integer approvalId: type: integer activity: type: string pagination: type: object properties: page: type: integer totalPages: type: integer examples: Example 1: value: data: - id: 123 actionTime: '2025-06-09 00:00:00' userId: 364263 approvalId: 456789 activity: '0' pagination: page: 1 totalPages: 5 default: description: Default security: - api_key_in_header: [] /v3/approval/{id}/create-message: post: summary: Create approval message description: Create approval message tags: - '[v3] Approval' operationId: create-approval-message parameters: - schema: type: string example: '74356654' name: id in: path required: true - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - from - to properties: message: type: string description: message example: this is example message event: type: integer description: | 0 - Open 1 - Approved 2 - Pending 3 - Rejected enum: - 0 - 1 - 2 - 3 example: 2 examples: Example: value: message: some message event: 2 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: object properties: id: type: integer approvalId: type: integer userId: type: integer message: type: string event: type: integer addTime: type: string examples: Example 1: value: data: - id: 1323435 approvalId: 34523534 userId: 2346445 message: some message event: 2 addTime: '2025-06-09 00:00:00' default: description: Default security: - api_key_in_header: [] /v3/approval/send-reminder: post: summary: Send reminder description: Send reminder tags: - '[v3] Approval' operationId: send-reminder parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - approvalIds properties: approvalIds: type: array description: Array of approval ids example: - 34523534 - 34535345 message: type: string description: Comment send in mail example: this is message examples: Example: value: approvalIds: - 34523534 - 34535345 message: this is message responses: '200': description: OK content: application/json: schema: type: object properties: message: type: string example: ok examples: Example 1: value: message: ok default: description: Default security: - api_key_in_header: [] /v3/taskPicker/favourites: get: summary: List of favorite tasks tags: - '[v3] Task Picker' responses: '200': description: OK content: application/json: schema: type: object properties: data: type: object properties: favourites: type: array items: $ref: '#/components/schemas/TaskPicker-favourite-list-response' suggested: type: array message: type: string meta: type: object properties: favourites: type: object properties: limit: type: integer examples: Example 1: value: data: favourites: - taskId: 123456 name: My task parentId: 98765 level: 3 note: my note rootGroupId: integer archived: 0 billable: false, color: '#4DC2E8' hasChildren: false disabled: false disableReason: '' isMatched: true suggested: [] message: ok meta: favourites: limit: 10 headers: {} operationId: get-task-picker-favourite-list security: - api_key_in_header: [] /v3/taskPicker/favourites/add/{taskId}: post: summary: Add task to favorite tasks list tags: - '[v3] Task Picker' responses: '200': description: OK content: application/json: schema: type: object properties: data: type: object properties: favourites: type: array items: $ref: '#/components/schemas/TaskPicker-favourite-list-response' suggested: type: array message: type: string meta: type: object properties: favourites: type: object properties: limit: type: integer examples: Example 1: value: data: favourites: - taskId: 123456 name: My task parentId: 98765 level: 3 note: my note rootGroupId: integer archived: 0 billable: false, color: '#4DC2E8' hasChildren: false disabled: false disableReason: '' isMatched: true suggested: [] message: ok meta: favourites: limit: 10 headers: {} operationId: post-task-picker-favourite-add security: - api_key_in_header: [] parameters: - schema: type: integer example: 123456 name: taskId in: path required: true /v3/taskPicker/favourites/delete/{taskId}: delete: summary: Delete task from favorite tasks list tags: - '[v3] Task Picker' responses: '200': description: OK content: application/json: schema: type: object properties: data: type: object properties: favourites: type: array items: $ref: '#/components/schemas/TaskPicker-favourite-list-response' suggested: type: array message: type: string meta: type: object properties: favourites: type: object properties: limit: type: integer examples: Example 1: value: data: favourites: - taskId: 123456 name: My task parentId: 98765 level: 3 note: my note rootGroupId: integer archived: 0 billable: false, color: '#4DC2E8' hasChildren: false disabled: false disableReason: '' isMatched: true suggested: [] message: ok meta: favourites: limit: 10 headers: {} operationId: delete-task-picker-favourite-delete security: - api_key_in_header: [] parameters: - schema: type: integer example: 123456 name: taskId in: path required: true /v3/projects: post: summary: List projects tree description: List projects tree tags: - '[v3] Projects' operationId: projects-list parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - parentId - status properties: parentId: type: integer description: Parent ID to search (0 for root task) example: 0 status: type: string description: Filter tasks by status enum: - all - active example: active context: type: string description: Project tree context enum: - invoice - time_tracking - reports - edit_settings - create_subtask default: reports example: time_tracking include: type: array description: List of additional fields to include. The users field contains active assigned users only. enum: - color - users - groups - last_used example: - color - users page: type: integer description: Page number for pagination example: 1 limit: type: integer description: Number of items per page example: 25 examples: Example: value: parentId: 0 status: active context: reports include: - color - users page: 1 limit: 25 responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object $ref: '#/components/schemas/Projects-item' pagination: type: object properties: page: type: integer totalPages: type: integer examples: Example 1: value: data: - taskId: 34523534 name: Calendars parentId: 0 level: 1 note: Personal calendars rootGroupId: 66 archived: 0 billable: true hasChildren: false children: [] disabled: false disableReason: '' pagination: page: 1 totalPages: 5 default: description: Default security: - api_key_in_header: [] /v3/projects/search: post: summary: Search in projects tree description: Search in projects tree tags: - '[v3] Projects' operationId: projects-search parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - status properties: searchText: type: string description: Phrase to search for. At least one of `searchText` or `userIds` is required. minLength: 2 example: searching for this userIds: type: array description: User IDs directly assigned to returned projects. At least one of `searchText` or `userIds` is required. minItems: 1 maxItems: 500 items: type: integer example: - 123 - 456 status: type: string description: Filter tasks by status enum: - all - active example: active context: type: string description: Project tree context enum: - invoice - time_tracking - reports - edit_settings - create_subtask default: reports example: time_tracking include: type: array description: List of additional fields to include items: type: string enum: - color - users - groups - last_used example: - color - users examples: Example: value: status: active searchText: searching for this context: reports include: - color - users responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object $ref: '#/components/schemas/Projects-item' meta: type: object searchInfo: type: object properties: items: type: integer total: type: integer examples: Example 1: value: data: - taskId: 34523534 name: Calendars parentId: 0 level: 1 note: Personal calendars rootGroupId: 66 archived: 0 billable: true hasChildren: false children: [] disabled: false disableReason: '' isMatching: true meta: {} searchInfo: items: 1 total: 5 default: description: Default security: - api_key_in_header: [] /v3/projects/{taskId}/assigned-users: get: summary: List assigned users for project task description: Returns active users assigned to a task, including inherited assignments metadata. tags: - '[v3] Projects' operationId: projects-assigned-users parameters: - schema: type: integer example: 34523534 in: path required: true name: taskId - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type responses: '200': description: OK content: application/json: schema: type: object properties: data: type: array items: type: object properties: userId: type: integer displayName: type: string email: type: string roleId: type: integer taskId: type: integer nullable: true meta: type: object properties: roles: type: array items: type: object properties: roleId: type: integer name: type: string sort: type: integer tasks: type: array items: type: object properties: taskId: type: integer name: type: string examples: Example 1: value: data: - userId: 364263 displayName: John Smith email: john.smith@example.com roleId: 2 taskId: null - userId: 364264 displayName: Jane Doe email: jane.doe@example.com roleId: 3 taskId: 123456 meta: roles: - roleId: 2 name: Manager sort: 10 - roleId: 3 name: Member sort: 20 tasks: - taskId: 123456 name: Parent task '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: You are not allowed to use this endpoint. security: - api_key_in_header: [] /v3/projects/{taskId}/assign: put: summary: Assign users to project task description: Assigns one or more users to the selected project task with the provided project role. tags: - '[v3] Projects' operationId: projects-assign-users parameters: - schema: type: integer example: 34523534 in: path required: true name: taskId - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - userIds - roleId properties: userIds: type: array description: List of user IDs to assign to the task. minItems: 1 items: type: integer minimum: 1 roleId: type: integer description: Project role ID to assign to all listed users. minimum: 1 examples: Example 1: value: userIds: - 364263 - 364264 roleId: 3 responses: '200': description: Users assigned successfully content: application/json: schema: type: object properties: data: type: string example: ok examples: Example 1: value: data: ok '400': description: Bad request or exposed business error content: application/json: schema: type: object properties: message: type: string message_code: type: string message_params: type: object additionalProperties: true errors: type: array items: type: object properties: property: type: string message: type: string examples: Validation error: value: message: Request validation failed errors: - property: userIds message: This value should not be blank. User does not exist: value: message: At least one of users provided in payload does not exist message_code: projects.error.user_does_not_exist message_params: [] '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string message_code: type: string message_params: type: object additionalProperties: true examples: No endpoint access: value: message: You are not allowed to use this endpoint. Access to task denied: value: message: You have no rights in task 34523534 message_code: projects.error.assign.access_to_task_denied message_params: task_id: 34523534 Role higher than owned: value: message: You can not set role 4 as this role is higher than your own message_code: projects.error.assign.permission_higher_than_owned message_params: role_id: 4 '500': description: Internal server error content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: An unspecified error occurred. security: - api_key_in_header: [] /v3/projects/{taskId}/unassign: put: summary: Unassign users from project task description: Removes direct user assignments from the selected project task. tags: - '[v3] Projects' operationId: projects-unassign-users parameters: - schema: type: integer example: 34523534 in: path required: true name: taskId - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - userIds properties: userIds: type: array description: List of user IDs to unassign from the task. minItems: 1 items: type: integer minimum: 1 examples: Example 1: value: userIds: - 364263 - 364264 responses: '200': description: Users unassigned successfully content: application/json: schema: type: object properties: data: type: string example: ok examples: Example 1: value: data: ok '400': description: Bad request or exposed business error content: application/json: schema: type: object properties: message: type: string message_code: type: string message_params: type: object additionalProperties: true errors: type: array items: type: object properties: property: type: string message: type: string examples: Validation error: value: message: Request validation failed errors: - property: userIds message: This value should not be blank. User does not exist: value: message: At least one of users provided in payload does not exist message_code: projects.error.user_does_not_exist message_params: [] '403': description: Forbidden content: application/json: schema: type: object properties: message: type: string message_code: type: string message_params: type: object additionalProperties: true examples: No endpoint access: value: message: You are not allowed to use this endpoint. Access to task denied: value: message: You have no rights in task 34523534 message_code: projects.error.assign.access_to_task_denied message_params: task_id: 34523534 Cannot override role: value: message: Cannot override role for user John Smith message_code: projects.error.assign.cannot_override_role_for_user message_params: user_display_name: John Smith '500': description: Internal server error content: application/json: schema: type: object properties: message: type: string examples: Example 1: value: message: An unspecified error occurred. security: - api_key_in_header: [] /v3/attendance/predefined-days/{groupId}: get: summary: Predefined Days Assigned To Group [beta] description: 'List of all predefined days assigned directly to given group. Note: This is a beta version.' tags: - '[v3] Attendance' operationId: attendance-predefined-days parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: groupId responses: '200': description: List of all predefined days assigned directly to given group content: application/json: schema: type: object properties: data: type: array items: properties: id: type: integer description: ID of the assignment groupId: type: integer description: ID of the group day is assigned to date: type: string description: Date dateTypeId: type: integer description: Id of the day type dayTypeSlug: type: string description: String identifier of the day type examples: Success Response: value: data: - id: 15 groupId: 66 date: '2026-01-01' dayTypeId: 12 dayTypeSlug: holidays - id: 16 - groupId: 66 - date: '2026-01-06' - dayTypeId: 9 - dayTypeSlug: remote_work '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found security: - api_key_in_header: [] /v3/attendance/predefined-days/{groupId}/effective: get: summary: Effective Predefined Days Assigned To Group [beta] description: 'List of all day types assigned to a group along with inheritance from parent groups. Note: This is a beta version.' tags: - '[v3] Attendance' operationId: attendance-effective-predefined-days parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: groupId responses: '200': description: List of all day types assigned to a group along with inheritance from parent groups content: application/json: schema: type: object properties: data: type: array items: properties: id: type: integer description: ID of the assignment groupId: type: integer description: ID of the group day was assigned to (if different than ID in path assignment was inherited) date: type: string description: Date dateTypeId: type: integer description: Id of the day type dayTypeSlug: type: string description: String identifier of the day type examples: Success Response: value: data: - id: 15 groupId: 66 date: '2026-01-01' dayTypeId: 12 dayTypeSlug: holidays - id: 16 - groupId: 420 - date: '2026-01-06' - dayTypeId: 9 - dayTypeSlug: remote_work '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found security: - api_key_in_header: [] /v3/attendance/predefined-days/create: post: summary: Create Predefined Days [beta] description: 'Create predefined days for a group. Note: This is a beta version.' tags: - '[v3] Attendance' operationId: attendance-predefined-days-create parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type requestBody: required: true content: application/json: schema: type: object required: - dayType - dates - groupId properties: dayType: type: string description: String identifier of the day type to assign example: holidays dates: type: array description: List of dates to assign example: - '2026-01-01' - '2026-01-06' groupId: type: integer description: ID of the group for the assignment example: 66 responses: '200': description: Dates assignment was completed content: application/json: schema: type: object properties: data: type: string examples: Success Response: value: data: ok '400': description: Bad Request - Validation errors '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found security: - api_key_in_header: [] /v3/attendance/predefined-days/{groupId}/remove/{date}: delete: summary: Remove Predefined Day [beta] description: 'Remove predefined day from a group. Note: This is a beta version.' tags: - '[v3] Attendance' operationId: attendance-predefined-days-remove parameters: - schema: type: string example: application/json in: header name: Accept - schema: type: string example: application/json in: header name: Content-Type - schema: type: integer example: 1 in: path required: true name: groupId - schema: type: string example: '2026-01-29' in: path required: true name: date responses: '200': description: Dates assignment removal was completed content: application/json: schema: type: object properties: data: type: string examples: Success Response: value: data: ok '400': description: Bad Request - Validation errors '401': description: Unauthorized '403': description: Forbidden '404': description: Not Found security: - api_key_in_header: [] /v3/attendance/calendar/search: post: summary: Attendance calendar search [beta] description: 'Returns attendance calendar data for users in a date range. Note: This is a beta version.' tags: - '[v3] Attendance' operationId: attendance-calendar-search requestBody: required: true content: application/json: schema: type: object properties: periodStart: type: string format: date example: '2025-03-01' periodEnd: type: string format: date example: '2025-03-07' userIds: type: array items: type: integer includeDisabled: type: boolean default: false required: - periodStart - periodEnd responses: '200': description: Calendar data content: application/json: schema: type: object properties: meta: type: object properties: users: type: object additionalProperties: type: object properties: id: type: integer email: type: string displayName: type: string dayTypes: type: object additionalProperties: type: object properties: id: type: integer name: type: string slug: type: string data: type: object additionalProperties: type: object additionalProperties: type: object properties: date: type: string format: date description: Date in ISO format (Y-m-d) dayTypeId: type: integer description: ID of the day type shouldBe: type: integer description: Expected work time in minutes vacationTime: type: integer description: Vacation time in minutes note: type: string description: Optional note for the day workStartTime: type: string description: Work start time (HH:mm:ss) workEndTime: type: string description: Work end time (HH:mm:ss) workTime: type: string description: Total work time in minutes requestStatus: type: string nullable: true description: Attendance request status (e.g., "pending", "approved", "rejected") or null if no request pendingDayTypeId: type: integer nullable: true description: ID of the day type from the pending attendance request or null if there is no pending request hasRequestHistory: type: integer description: Whether attendance record exists (was modified) - 0 or 1 isAttendanceApproved: type: integer description: Whether attendance is approved - 0 or 1 examples: Success Response: value: meta: users: '123': id: 123 email: user@example.com displayName: Test User dayTypes: '1': id: 1 name: Normal slug: normal data: '123': '2025-03-01': date: '2025-03-01' dayTypeId: 1 shouldBe: 480 vacationTime: 0 note: '' workStartTime: '08:00:00' workEndTime: '16:00:00' workTime: '480' requestStatus: pending pendingDayTypeId: 5 hasRequestHistory: 1 isAttendanceApproved: 0 '401': description: Unauthorized '403': description: Forbidden security: - api_key_in_header: [] /attendance-request/has-pending: get: summary: Has Pending Attendance Requests [beta] description: 'Checks if the current user has any pending attendance requests to process. Note: This is a beta version.' tags: - '[v3] Attendance Requests' operationId: attendance-requests-has-pending responses: '200': description: Returns information whether the user has pending attendance requests. content: application/json: schema: type: object properties: has_pending: type: boolean description: True if there are pending requests, false otherwise. examples: Success Response: value: has_pending: true '401': description: Unauthorized content: application/json: schema: type: object properties: error: type: string example: unauthorized security: - api_key_in_header: [] /attendance-request: post: summary: Create attendance request [beta] tags: - '[v3] Attendance' description: | Creates an attendance request for a specified user and date. The request can be created by the user themselves or by an administrator/supervisor for another user. Depending on permissions and day type settings, the request may be auto-approved or require manual approval. Note: This is a beta version. operationId: post-attendance-request x-internal: false requestBody: required: true content: application/json: schema: type: object required: - targetUserId - date - dayTypeId - shouldBe - vacationHours properties: targetUserId: type: integer description: ID of the user for whom the attendance request is created example: 123 date: type: string format: date pattern: ^\d{4}-\d{2}-\d{2}$ description: Date in YYYY-MM-DD format example: '2026-03-20' dayTypeId: type: integer description: ID of the day type (must exist in the user's root group) example: 5 shouldBe: type: integer minimum: 0 description: Expected time for this day in minutes (e.g., 480 = 8 hours) example: 480 vacationHours: type: integer minimum: 0 description: Time to deduct from vacation limit in minutes example: 0 note: type: string description: Optional note for the request example: Vacation request nullable: true eraseComputerActivities: type: boolean description: Whether to erase computer activities for this day. Requires allowErasingData setting enabled for the root group. example: false default: false examples: Example - Vacation request: value: targetUserId: 123 date: '2026-03-20' dayTypeId: 5 shouldBe: 480 vacationHours: 480 note: Annual vacation eraseComputerActivities: false Example - Sick leave: value: targetUserId: 123 date: '2026-03-21' dayTypeId: 3 shouldBe: 480 vacationHours: 0 note: Medical appointment eraseComputerActivities: false Example - Sick leave with erase: value: targetUserId: 123 date: '2026-03-22' dayTypeId: 3 shouldBe: 480 vacationHours: 0 note: Medical appointment eraseComputerActivities: true responses: '201': description: Attendance request created successfully content: application/json: schema: type: object properties: id: type: integer description: ID of the created request user_id: type: integer description: ID of the user date: type: string format: date description: Date of the request day_type_id: type: integer description: ID of the day type status: type: string enum: - pending - approved - rejected description: Status of the request time: type: integer description: Expected time in minutes vacation_time: type: integer description: Vacation time in minutes note: type: string description: Request note erase_computer_activities: type: boolean description: Whether computer activities should be erased. Only included in response if allowErasingData setting is enabled for the root group. processed_by: type: integer nullable: true description: ID of the user who processed the request (null if pending) examples: Auto-approved request: value: id: 456 user_id: 123 date: '2026-03-20' day_type_id: 5 status: approved time: 480 vacation_time: 480 note: Annual vacation erase_computer_activities: false processed_by: 123 Pending request: value: id: 457 user_id: 123 date: '2026-03-21' day_type_id: 3 status: pending time: 480 vacation_time: 0 note: Medical appointment erase_computer_activities: false processed_by: null '400': description: Bad request - validation error content: application/json: schema: type: object properties: message: type: string description: Error message examples: Invalid date format: value: message: Date must be in YYYY-MM-DD format Invalid day type: value: message: Day type does not exist in this group. Erasing not allowed: value: message: Erasing computer activities is not allowed for this user. '401': description: Unauthorized - user not authenticated content: application/json: schema: type: object properties: message: type: string examples: Example: value: message: Unauthorized '403': description: Forbidden - user does not have permission to create this request content: application/json: schema: type: object properties: message: type: string examples: Example: value: message: You do not have permission to create this attendance request. '500': description: Internal server error content: application/json: schema: type: object properties: message: type: string examples: Example: value: message: An unspecified error occurred. security: - api_key_in_header: [] components: schemas: Expense-category-request: type: object x-examples: Example 1: name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 x-internal: false title: Expense-category request x-tags: - Expense properties: name: type: string color: type: string unitPrice: type: integer nullable: true unitName: type: string nullable: true currencyId: type: integer required: - name - color - currencyId Expense-category-response: type: object x-examples: Example 1: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null properties: id: type: integer name: type: string color: type: string unitPrice: type: integer nullable: true unitName: type: string nullable: true currencyId: type: integer createdAt: type: string updatedAt: type: string nullable: true x-internal: false title: Expense-category response x-tags: - Expense Expense-response: type: object x-examples: Example 1: message: ok data: id: 74 currencyId: 2 expenseCategory: id: 53 name: My category color: '#4DC2E8' unitPrice: 1000 unitName: my unit currencyId: 2 createdAt: '2023-09-07 12:26:34' updatedAt: null taskId: 512 amount: 2522 description: My description... status: 0 isBillable: true invoiceId: null madeBy: 256 madeAt: '2023-09-12 10:32:22' createdBy: 256 updatedBy: 256 createdAt: '2023-10-21 09:41:33' updatedAt: '2023-10-21 09:41:41' x-internal: false properties: id: type: integer currencyId: type: integer expenseCategory: $ref: '#/components/schemas/Expense-category-response' taskId: type: integer amount: type: integer description: type: string nullable: true status: type: integer isBillable: type: boolean invoiceId: type: integer nullable: true madeBy: type: integer madeAt: type: string createdBy: type: integer updatedBy: type: integer nullable: true createdAt: type: string updatedAt: type: string nullable: true Expense-request: type: object x-examples: Example 1: currencyId: 2 expenseCategoryId: '50' taskId: 512 amount: 2522 description: My description... isBillable: true madeBy: 256 madeAt: '2023-09-12 10:32:22' title: Expense request x-internal: false properties: currencyId: type: integer expenseCategoryId: type: integer taskId: type: integer amount: type: integer description: type: string isBillable: type: boolean madeBy: type: integer madeAt: type: string required: - currencyId - expenseCategoryId - taskId - amount - isBillable - madeBy - madeAt x-tags: - Expense Attachment: type: object properties: id: type: integer userFilename: type: string mimeType: type: string url: type: string x-examples: Example 1: id: 14 userFilename: 02.pdf mimeType: application/pdf url: /internal/api/v3/storage/download/14 x-internal: false x-tags: - Expense TaskPicker-favourite-list-response: type: object x-examples: Example 1: data: favourites: - taskId: 123456 name: My task parentId: 98765 level: 3 note: my note rootGroupId: integer archived: 0 billable: false, color: '#4DC2E8' hasChildren: false disabled: false disableReason: '' isMatched: true suggested: [] message: ok meta: favourites: limit: 10 properties: taskId: type: integer name: type: string parentId: type: integer level: type: integer note: type: string rootGroupId: type: integer archived: type: integer billable: type: boolean color: type: string hasChildren: type: boolean disabled: type: boolean disableReason: type: string isMatched: type: boolean title: Favourite task x-tags: - TaskPicker Projects-item: x-examples: Example 1: taskId: 123456 name: My task parentId: 98765 level: 3 note: my note rootGroupId: 66 archived: 0 billable: false hasChildren: false children: [] disabled: false disableReason: '' isMatched: true type: object properties: taskId: type: integer name: type: string parentId: type: integer level: type: integer note: type: string|null rootGroupId: type: integer archived: type: integer billable: type: bool hasChildren: type: bool children: type: array disabled: type: bool disableReason: type: string title: Project Item x-tags: - Projects Common-validation-error-item: type: object properties: property: type: string message: type: string required: - property - message securitySchemes: api_key_in_header: type: http scheme: bearer description: '' OIDC: type: openIdConnect openIdConnectUrl: authenticate/oidc parameters: format: name: format in: path required: true schema: type: string enum: - json - xml - php - csv example: json default: json description: response format group_id: name: group_id in: path required: true schema: type: number minimum: 1 rate_id: name: rate_id in: path required: true schema: type: number minimum: 1 rate_type_id: name: rate_type_id in: path required: true schema: type: number user_id: name: user_id in: path required: true schema: type: string tag_id: name: tag_id in: path required: true schema: type: number tag_list_id: name: tag_list_id in: path required: true schema: type: number entry_id: name: entry_id in: path required: true schema: type: number task_id: name: task_id in: path required: true schema: type: number feature_id: name: feature_id in: path required: true schema: type: number responses: notoken: description: Example response when no token is given content: application/json: schema: description: '' type: object properties: message: type: string minLength: 1 required: - message examples: no token: value: message: authentication required - api token not found examples: {} x-tagGroups: - name: TimeCamp API tags: - '[v1] User' - '[v1] Entry' - '[v1] Tags' - '[v1] Group' - '[v1] Approvals' - '[v1] Computer Activities' - '[v1] Timer' - '[v1] Task' - '[v1] Attendance' - '[v1] Roles & Permissions' - '[v1] Billing Rates' - '[v1] Userlog' - '[v1] Activity alert' - '[v3] Timer' - '[v3] Invoices' - '[v3] Computer Activities' - '[v3] Time Entry' - '[v3] Task Archive' - '[v3] Time Entry Restriction' - '[v3] Expense' - '[v3] Plan' - '[v3] Storage' - '[v3] Module' - '[v3] Marketplace' - '[v3] Remote work detection' - '[v3] Data Export' - '[v3] Custom Fields' - '[v3] Approval' - '[v3] Task' - '[v3] Projects' - '[v3] Attendance' - '[v3] Attendance Requests'