{"items":[{"type":"link","fsPath":"@v1/index.md","metadata":{"type":"markdown"},"label":"Introduction","link":"/v1","routeSlug":"/v1","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"link","label":"WebWork Tracker REST API V1","link":"/v1/api","routeSlug":"/v1/api","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Reports","link":"/v1/api/reports","routeSlug":"/v1/api/reports","items":[{"label":"Get full report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/reports/getfulldata","routeSlug":"/v1/api/reports/getfulldata","metadata":{"seo":{"title":"Get full report","description":"Get general information about your team members tracked time for each task. Returns data grouped by user with their tasks and tracked minutes."}},"httpPath":"/reports/full-data","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get daily report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/reports/getdailydata","routeSlug":"/v1/api/reports/getdailydata","metadata":{"seo":{"title":"Get daily report","description":"Get information about your team members tracked time sorted by tasks and projects. Returns data grouped by date with projects and tasks breakdown."}},"httpPath":"/reports/daily-data","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get daily timeline","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/reports/getdailytimeline","routeSlug":"/v1/api/reports/getdailytimeline","metadata":{"seo":{"title":"Get daily timeline","description":"Get information about worked time grouped by tasks and projects with start/end times for each task. Each time entry includes timesheet approval information when available."}},"httpPath":"/reports/daily-timeline","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Users","link":"/v1/api/users","routeSlug":"/v1/api/users","items":[{"label":"Get all users","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/getallusers","routeSlug":"/v1/api/users/getallusers","metadata":{"seo":{"title":"Get all users","description":"Get all team members in your workspace with detailed information including rates."}},"httpPath":"/users","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Invite user","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/createuser","routeSlug":"/v1/api/users/createuser","metadata":{"seo":{"title":"Invite user","description":"Invite a new user to your team"}},"httpPath":"/users","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update owner","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/updateowner","routeSlug":"/v1/api/users/updateowner","metadata":{"seo":{"title":"Update owner","description":"Update workspace owner account settings"}},"httpPath":"/users","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get one user","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/getuser","routeSlug":"/v1/api/users/getuser","metadata":{"seo":{"title":"Get one user","description":"Get information about a specific user"}},"httpPath":"/users/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update user","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/updateuser","routeSlug":"/v1/api/users/updateuser","metadata":{"seo":{"title":"Update user","description":"Update team member settings"}},"httpPath":"/users/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Archive user","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/deleteuser","routeSlug":"/v1/api/users/deleteuser","metadata":{"seo":{"title":"Archive user","description":"Archive a user (move to archived members list)"}},"httpPath":"/users/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Restore user","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/restoreuser","routeSlug":"/v1/api/users/restoreuser","metadata":{"seo":{"title":"Restore user","description":"Restore an archived user"}},"httpPath":"/users/restore/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Block user","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/blockuser","routeSlug":"/v1/api/users/blockuser","metadata":{"seo":{"title":"Block user","description":"Block a team member"}},"httpPath":"/users/block/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Unblock user","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/users/unblockuser","routeSlug":"/v1/api/users/unblockuser","metadata":{"seo":{"title":"Unblock user","description":"Unblock a team member"}},"httpPath":"/users/unblock/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Projects","link":"/v1/api/projects","routeSlug":"/v1/api/projects","items":[{"label":"Get all projects","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/projects/getallprojects","routeSlug":"/v1/api/projects/getallprojects","metadata":{"seo":{"title":"Get all projects","description":"Get all projects in your workspace with tags"}},"httpPath":"/projects","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Create project","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/projects/createproject","routeSlug":"/v1/api/projects/createproject","metadata":{"seo":{"title":"Create project","description":"Create a new project in your workspace"}},"httpPath":"/projects","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get one project","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/projects/getproject","routeSlug":"/v1/api/projects/getproject","metadata":{"seo":{"title":"Get one project","description":"Get information about a specific project"}},"httpPath":"/projects/{project_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update project","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/projects/updateproject","routeSlug":"/v1/api/projects/updateproject","metadata":{"seo":{"title":"Update project","description":"Update an existing project"}},"httpPath":"/projects/{project_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Delete project","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/projects/deleteproject","routeSlug":"/v1/api/projects/deleteproject","metadata":{"seo":{"title":"Delete project","description":"Delete an existing project"}},"httpPath":"/projects/{project_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Contracts","link":"/v1/api/contracts","routeSlug":"/v1/api/contracts","items":[{"label":"Get all contracts","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/contracts/getallcontracts","routeSlug":"/v1/api/contracts/getallcontracts","metadata":{"seo":{"title":"Get all contracts","description":"Get all contracts in your workspace. Can filter by project_id and/or user_id."}},"httpPath":"/contracts","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Create contract","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/contracts/createcontract","routeSlug":"/v1/api/contracts/createcontract","metadata":{"seo":{"title":"Create contract","description":"Create a new contract (assign user to project)"}},"httpPath":"/contracts","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get one contract","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/contracts/getcontract","routeSlug":"/v1/api/contracts/getcontract","metadata":{"seo":{"title":"Get one contract","description":"Get information about a specific contract"}},"httpPath":"/contracts/{contract_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update contract","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/contracts/updatecontract","routeSlug":"/v1/api/contracts/updatecontract","metadata":{"seo":{"title":"Update contract","description":"Update an existing contract"}},"httpPath":"/contracts/{contract_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Delete contract","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/contracts/removecontract","routeSlug":"/v1/api/contracts/removecontract","metadata":{"seo":{"title":"Delete contract","description":"Delete an existing contract"}},"httpPath":"/contracts/{contract_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Tasks","link":"/v1/api/tasks","routeSlug":"/v1/api/tasks","items":[{"label":"Get all tasks","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/getalltasks","routeSlug":"/v1/api/tasks/getalltasks","metadata":{"seo":{"title":"Get all tasks","description":"Get all tasks in your workspace. Can filter by project_id."}},"httpPath":"/tasks","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Create task","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/createtask","routeSlug":"/v1/api/tasks/createtask","metadata":{"seo":{"title":"Create task","description":"Create a new task"}},"httpPath":"/tasks","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get one task","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/gettask","routeSlug":"/v1/api/tasks/gettask","metadata":{"seo":{"title":"Get one task","description":"Get information about a specific task"}},"httpPath":"/tasks/{task_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update task","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/updatetask","routeSlug":"/v1/api/tasks/updatetask","metadata":{"seo":{"title":"Update task","description":"Update an existing task"}},"httpPath":"/tasks/{task_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Delete task","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/deletetask","routeSlug":"/v1/api/tasks/deletetask","metadata":{"seo":{"title":"Delete task","description":"Delete an existing task"}},"httpPath":"/tasks/{task_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get task assignees","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/gettaskassignees","routeSlug":"/v1/api/tasks/gettaskassignees","metadata":{"seo":{"title":"Get task assignees","description":"Get task with its assignees"}},"httpPath":"/tasks/{task_id}/assignees","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Create assignee","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/createassignee","routeSlug":"/v1/api/tasks/createassignee","metadata":{"seo":{"title":"Create assignee","description":"Assign a user to a task. The user should already have a contract in the project."}},"httpPath":"/tasks/assign/{task_id}/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Remove assignee","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/tasks/removeassignee","routeSlug":"/v1/api/tasks/removeassignee","metadata":{"seo":{"title":"Remove assignee","description":"Unassign a user from a task"}},"httpPath":"/tasks/unassign/{task_id}/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Project Viewers","link":"/v1/api/project-viewers","routeSlug":"/v1/api/project-viewers","items":[{"label":"Get all project viewers","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/project-viewers/getallprojectviewers","routeSlug":"/v1/api/project-viewers/getallprojectviewers","metadata":{"seo":{"title":"Get all project viewers","description":"Get all project viewers in your workspace"}},"httpPath":"/project-viewers","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Invite project viewer","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/project-viewers/createprojectviewer","routeSlug":"/v1/api/project-viewers/createprojectviewer","metadata":{"seo":{"title":"Invite project viewer","description":"Invite a new project viewer (client)"}},"httpPath":"/project-viewers","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get one project viewer","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/project-viewers/getprojectviewer","routeSlug":"/v1/api/project-viewers/getprojectviewer","metadata":{"seo":{"title":"Get one project viewer","description":"Get information about a specific project viewer"}},"httpPath":"/project-viewers/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Archive project viewer","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/project-viewers/deleteprojectviewer","routeSlug":"/v1/api/project-viewers/deleteprojectviewer","metadata":{"seo":{"title":"Archive project viewer","description":"Archive a project viewer (move to archived list)"}},"httpPath":"/project-viewers/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Assign project to project viewer","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/project-viewers/assignprojectprojectviewer","routeSlug":"/v1/api/project-viewers/assignprojectprojectviewer","metadata":{"seo":{"title":"Assign project to project viewer","description":"Assign a project to a project viewer"}},"httpPath":"/project-viewers/assign-project","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Restore project viewer","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/project-viewers/restoreprojectviewer","routeSlug":"/v1/api/project-viewers/restoreprojectviewer","metadata":{"seo":{"title":"Restore project viewer","description":"Restore an archived project viewer"}},"httpPath":"/project-viewers/restore/{user_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Timesheets","link":"/v1/api/timesheets","routeSlug":"/v1/api/timesheets","items":[{"label":"Get all timesheets","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/timesheets/gettimesheetsapprovals","routeSlug":"/v1/api/timesheets/gettimesheetsapprovals","metadata":{"seo":{"title":"Get all timesheets","description":"Get all timesheets in your workspace with optional filters"}},"httpPath":"/timesheets","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Approve timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/timesheets/approvetimesheet","routeSlug":"/v1/api/timesheets/approvetimesheet","metadata":{"seo":{"title":"Approve timesheet","description":"Approve a submitted timesheet"}},"httpPath":"/timesheets/approve/{id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Reject timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/timesheets/rejecttimesheet","routeSlug":"/v1/api/timesheets/rejecttimesheet","metadata":{"seo":{"title":"Reject timesheet","description":"Reject a submitted timesheet with a reason"}},"httpPath":"/timesheets/reject/{id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Submit timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/timesheets/submittimesheet","routeSlug":"/v1/api/timesheets/submittimesheet","metadata":{"seo":{"title":"Submit timesheet","description":"Submit a timesheet for approval"}},"httpPath":"/timesheets/submit/{id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Unsubmit timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/timesheets/unsubmittimesheet","routeSlug":"/v1/api/timesheets/unsubmittimesheet","metadata":{"seo":{"title":"Unsubmit timesheet","description":"Unsubmit a submitted timesheet"}},"httpPath":"/timesheets/unsubmit/{id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Leaves","link":"/v1/api/leaves","routeSlug":"/v1/api/leaves","items":[{"label":"Get all leaves","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/leaves/getleaves","routeSlug":"/v1/api/leaves/getleaves","metadata":{"seo":{"title":"Get all leaves","description":"Get all leave requests in your workspace with optional filters"}},"httpPath":"/leaves","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Approve leave","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/leaves/approveleaverequest","routeSlug":"/v1/api/leaves/approveleaverequest","metadata":{"seo":{"title":"Approve leave","description":"Approve a pending leave request"}},"httpPath":"/leaves/approve/{id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Reject leave","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/leaves/rejectleaverequest","routeSlug":"/v1/api/leaves/rejectleaverequest","metadata":{"seo":{"title":"Reject leave","description":"Reject a pending leave request with a reason"}},"httpPath":"/leaves/reject/{id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get leave balances","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/leaves/getleavebalance","routeSlug":"/v1/api/leaves/getleavebalance","metadata":{"seo":{"title":"Get leave balances","description":"Get leave balances for users in your workspace"}},"httpPath":"/leaves/balances","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get leave policies","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/leaves/getleavepolicies","routeSlug":"/v1/api/leaves/getleavepolicies","metadata":{"seo":{"title":"Get leave policies","description":"Get leave policies in your workspace"}},"httpPath":"/leaves/policies","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Expenses","link":"/v1/api/expenses","routeSlug":"/v1/api/expenses","items":[{"label":"Get all expenses","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/expenses/getexpenses","routeSlug":"/v1/api/expenses/getexpenses","metadata":{"seo":{"title":"Get all expenses","description":"Get all expenses in your workspace with optional filters"}},"httpPath":"/expenses","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Create expense","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/expenses/createexpense","routeSlug":"/v1/api/expenses/createexpense","metadata":{"seo":{"title":"Create expense","description":"Create a new expense"}},"httpPath":"/expenses","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update expense","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/expenses/updateexpense","routeSlug":"/v1/api/expenses/updateexpense","metadata":{"seo":{"title":"Update expense","description":"Update an existing expense"}},"httpPath":"/expenses/{expense_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Delete expense","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/expenses/deleteexpense","routeSlug":"/v1/api/expenses/deleteexpense","metadata":{"seo":{"title":"Delete expense","description":"Delete an existing expense"}},"httpPath":"/expenses/{expense_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get expense categories","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/expenses/getexpensecategories","routeSlug":"/v1/api/expenses/getexpensecategories","metadata":{"seo":{"title":"Get expense categories","description":"Get all expense categories in your workspace"}},"httpPath":"/expenses/categories","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"group","label":"Webhooks","link":"/v1/api/webhooks","routeSlug":"/v1/api/webhooks","items":[{"label":"List all webhooks","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/webhooks/getallwebhooks","routeSlug":"/v1/api/webhooks/getallwebhooks","metadata":{"seo":{"title":"List all webhooks","description":"Get all webhooks in your workspace. Use this endpoint to manage and administer your webhooks.With webhooks, you can register callback URLs to receive real-time event notifications from our platform.Once registered, you'll automatically receive notifications whenever new events occur—such as data updates,member actions, or system alerts."}},"httpPath":"/v1/webhooks","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Create a webhook","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/webhooks/createwebhook","routeSlug":"/v1/api/webhooks/createwebhook","metadata":{"seo":{"title":"Create a webhook","description":"Create a new webhook to receive real-time event notifications. You must specify a callback URL and at least one event to subscribe to."}},"httpPath":"/v1/webhooks","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Get a single webhook","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/webhooks/getwebhook","routeSlug":"/v1/api/webhooks/getwebhook","metadata":{"seo":{"title":"Get a single webhook","description":"Get information about a specific webhook by its ID"}},"httpPath":"/v1/webhooks/{webhook_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Update a webhook","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/webhooks/updatewebhook","routeSlug":"/v1/api/webhooks/updatewebhook","metadata":{"seo":{"title":"Update a webhook","description":"Update an existing webhook's URL or subscribed events"}},"httpPath":"/v1/webhooks/{webhook_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"label":"Delete a webhook","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/v1/api/webhooks/deletewebhook","routeSlug":"/v1/api/webhooks/deletewebhook","metadata":{"seo":{"title":"Delete a webhook","description":"Delete an existing webhook"}},"httpPath":"/v1/webhooks/{webhook_id}","version":"v1","isDefault":false,"versionFolderId":"8a5edab2"}],"version":"v1","isDefault":false,"versionFolderId":"8a5edab2"},{"type":"link","fsPath":"@v2/index.md","metadata":{"type":"markdown"},"label":"Introduction","link":"/","routeSlug":"/","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"link","fsPath":"@v2/authorization.md","metadata":{"type":"markdown"},"label":"Authorization","link":"/authorization","routeSlug":"/authorization","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"link","label":"WebWork Time Tracker API V2 Documentation","link":"/api","routeSlug":"/api","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Workspaces","link":"/api/workspaces","routeSlug":"/api/workspaces","items":[{"label":"Get All Workspaces","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/workspaces/getworkspaces","routeSlug":"/api/workspaces/getworkspaces","metadata":{"seo":{"title":"Get All Workspaces","description":"Retrieve all active workspaces for the authenticated user. Returns paginated list of workspaces where the user is a member, including workspace details and status. Only non-blocked, non-deleted workspaces are returned."}},"httpPath":"/workspaces","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Workspace","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/workspaces/getworkspace","routeSlug":"/api/workspaces/getworkspace","metadata":{"seo":{"title":"Get Single Workspace","description":"Retrieve a single workspace membership by the ID returned by GET /workspaces. Same item shape as GET /workspaces. Requires workspace owner or executive manager permissions."}},"httpPath":"/workspaces/{workspaceId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Members","link":"/api/members","routeSlug":"/api/members","items":[{"label":"Get All Workspace Members","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/getmembers","routeSlug":"/api/members/getmembers","metadata":{"seo":{"title":"Get All Workspace Members","description":"Retrieve all team members in your workspace. Members are automatically filtered based on your role and permissions. You can apply additional filters to narrow down results. Rate and financial information is only visible if you have permission to view rates. Security: Only members of the specified workspace can access its member list."}},"httpPath":"/members","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Invite New Member","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/invitemember","routeSlug":"/api/members/invitemember","metadata":{"seo":{"title":"Invite New Member","description":"Invite a new member to your workspace. This endpoint is only accessible to Owners and Executive Managers. By default an invitation email and an in-app notification are sent to the invited member. Set notify to false to add the member silently — no email and no notification are sent, and you distribute the returned invitation_link yourself."}},"httpPath":"/members","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Member","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/getmember","routeSlug":"/api/members/getmember","metadata":{"seo":{"title":"Get Single Member","description":"Retrieve detailed information about a specific member in your workspace. Rate and financial information is only visible if you have permission to view rates."}},"httpPath":"/members/{memberId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Member","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/updatemember","routeSlug":"/api/members/updatemember","metadata":{"seo":{"title":"Update Member","description":"Update member information. This endpoint is only accessible to Owners and Executive Managers. You can update profile information, role, rate settings, and other member attributes. Security: You must be a member of the workspace AND have Owner/Executive Manager role. You can only update members within workspaces you have access to."}},"httpPath":"/members/{memberId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete (Archive) Member","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/deletemember","routeSlug":"/api/members/deletemember","metadata":{"seo":{"title":"Delete (Archive) Member","description":"Delete (archive) a member from your workspace. This is a soft delete - the member can be restored later. This endpoint is only accessible to Owners and Executive Managers."}},"httpPath":"/members/{memberId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Restore Archived Member","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/restoremember","routeSlug":"/api/members/restoremember","metadata":{"seo":{"title":"Restore Archived Member","description":"Restore a previously deleted (archived) member to your workspace. This endpoint is only accessible to Owners and Executive Managers."}},"httpPath":"/members/{memberId}/restore","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Activate Invited Member","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/members/activatemember","routeSlug":"/api/members/activatemember","metadata":{"seo":{"title":"Activate Invited Member","description":"Activate an invited member on their behalf — the API equivalent of the member opening the invitation email and accepting it. Instead of waiting for the member to click the link and choose a password, you set the password in this request and the member's account becomes active immediately."}},"httpPath":"/members/{memberId}/activate","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Teams","link":"/api/teams","routeSlug":"/api/teams","items":[{"label":"Get All Teams","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/getteams","routeSlug":"/api/teams/getteams","metadata":{"seo":{"title":"Get All Teams","description":"List workspace teams, paginated. Each team includes its assigned members (active workspace users only); every member carries an is_manager flag. Access: Owner / Executive Manager only."}},"httpPath":"/teams","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Team","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/createteam","routeSlug":"/api/teams/createteam","metadata":{"seo":{"title":"Create New Team","description":"Create a team. name is required, trimmed, max 70 chars, and unique per workspace (else 422). Access: Owner / Executive Manager only."}},"httpPath":"/teams","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Team","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/getteam","routeSlug":"/api/teams/getteam","metadata":{"seo":{"title":"Get Single Team","description":"Retrieve one team by its opaque encoded id, with assigned members and their is_manager flag. Access: Owner / Executive Manager only."}},"httpPath":"/teams/{team_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Team","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/updateteam","routeSlug":"/api/teams/updateteam","metadata":{"seo":{"title":"Update Team","description":"Rename a team. When present, name follows the same rules as create (trimmed non-empty, max 70, unique per workspace); a body that omits name entirely changes nothing and returns 200 with the team unmodified, while a name that is present but blank or null is rejected with 422. Access: Owner / Executive Manager only."}},"httpPath":"/teams/{team_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Team","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/deleteteam","routeSlug":"/api/teams/deleteteam","metadata":{"seo":{"title":"Delete Team","description":"Delete a team and all its member assignments. Access: Owner / Executive Manager only."}},"httpPath":"/teams/{team_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Assign Member to Team","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/assignteammember","routeSlug":"/api/teams/assignteammember","metadata":{"seo":{"title":"Assign Member to Team","description":"Assign a member to a team. Add-only: succeeds only when the member is not already in the team; re-assigning an already-assigned member returns 422 regardless of is_manager (assign never mutates an existing membership — use unassign to change it). Optional is_manager: true adds the member as Team Manager of this team (the member must already hold the Team Manager workspace role, else 422); false or omitted adds them as a plain member. Access: Owner / Executive Manager only."}},"httpPath":"/teams/{team_id}/assign/{member_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unassign Member from Team","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/teams/unassignteammember","routeSlug":"/api/teams/unassignteammember","metadata":{"seo":{"title":"Unassign Member from Team","description":"Remove a member from a team. If the member was a Team Manager of that team, that status is removed as well. Returns 404 if the member is not assigned to the team. Access: Owner / Executive Manager only."}},"httpPath":"/teams/{team_id}/unassign/{member_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Titles","link":"/api/titles","routeSlug":"/api/titles","items":[{"label":"Get All Titles","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/gettitles","routeSlug":"/api/titles/gettitles","metadata":{"seo":{"title":"Get All Titles","description":"List workspace titles, paginated, each with its assigned members. Titles have no manager concept. Access: Owner / Executive Manager only."}},"httpPath":"/titles","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Title","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/createtitle","routeSlug":"/api/titles/createtitle","metadata":{"seo":{"title":"Create New Title","description":"Create a title. name is required, trimmed, max 70 chars, and unique per workspace (else 422). Access: Owner / Executive Manager only."}},"httpPath":"/titles","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Title","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/gettitle","routeSlug":"/api/titles/gettitle","metadata":{"seo":{"title":"Get Single Title","description":"Retrieve one title by its opaque encoded id, with assigned members. Access: Owner / Executive Manager only."}},"httpPath":"/titles/{title_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Title","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/updatetitle","routeSlug":"/api/titles/updatetitle","metadata":{"seo":{"title":"Update Title","description":"Rename a title. When present, name follows the same rules as create; a body that omits name entirely changes nothing and returns 200 with the title unmodified, while a name that is present but blank or null is rejected with 422. Access: Owner / Executive Manager only."}},"httpPath":"/titles/{title_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Title","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/deletetitle","routeSlug":"/api/titles/deletetitle","metadata":{"seo":{"title":"Delete Title","description":"Delete a title and all its member assignments. Access: Owner / Executive Manager only."}},"httpPath":"/titles/{title_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Assign Member to Title","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/assigntitlemember","routeSlug":"/api/titles/assigntitlemember","metadata":{"seo":{"title":"Assign Member to Title","description":"Assign a member to a title. Add-only: re-assigning an already-assigned member returns 422. Titles have no manager concept, so no is_manager field is accepted (sending one returns 422). Access: Owner / Executive Manager only."}},"httpPath":"/titles/{title_id}/assign/{member_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unassign Member from Title","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/titles/unassigntitlemember","routeSlug":"/api/titles/unassigntitlemember","metadata":{"seo":{"title":"Unassign Member from Title","description":"Remove a member from a title. Returns 404 if the member is not assigned. Access: Owner / Executive Manager only."}},"httpPath":"/titles/{title_id}/unassign/{member_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Project Groups","link":"/api/project-groups","routeSlug":"/api/project-groups","items":[{"label":"Get All Groups","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/getprojectgroups","routeSlug":"/api/project-groups/getprojectgroups","metadata":{"seo":{"title":"Get All Groups","description":"List workspace project groups, paginated. Each group includes its assigned projects (the workspace's live projects only — deleted ones are omitted). Access: Owner / Executive Manager only."}},"httpPath":"/project-groups","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Group","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/createprojectgroup","routeSlug":"/api/project-groups/createprojectgroup","metadata":{"seo":{"title":"Create New Group","description":"Create a project group. name is required, trimmed, max 70 chars, and unique per workspace (else 422). The group is created empty — use the assign endpoint to add projects to it. Access: Owner / Executive Manager only."}},"httpPath":"/project-groups","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Group","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/getprojectgroup","routeSlug":"/api/project-groups/getprojectgroup","metadata":{"seo":{"title":"Get Single Group","description":"Retrieve one project group by its opaque encoded id, with its assigned projects. Access: Owner / Executive Manager only."}},"httpPath":"/project-groups/{project_group_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Group","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/updateprojectgroup","routeSlug":"/api/project-groups/updateprojectgroup","metadata":{"seo":{"title":"Update Group","description":"Rename a project group. When present, name follows the same rules as create (trimmed non-empty, max 70, unique per workspace); a body that omits name entirely changes nothing and returns 200 with the group unmodified, while a name that is present but blank or null is rejected with 422. To change which projects a group contains, use the assign / unassign endpoints. Access: Owner / Executive Manager only."}},"httpPath":"/project-groups/{project_group_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Group","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/deleteprojectgroup","routeSlug":"/api/project-groups/deleteprojectgroup","metadata":{"seo":{"title":"Delete Group","description":"Delete a project group and all of its project assignments. The projects themselves are not deleted — they simply become group-free. Access: Owner / Executive Manager only."}},"httpPath":"/project-groups/{project_group_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Add Project to Group","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/assignprojectgroupproject","routeSlug":"/api/project-groups/assignprojectgroupproject","metadata":{"seo":{"title":"Add Project to Group","description":"Assign a project to a project group. A project may belong to only one group: if the project is already in this group, or in any other group of the workspace, the request returns 422 — unassign it first. Access: Owner / Executive Manager only."}},"httpPath":"/project-groups/{project_group_id}/assign/{project_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Project from Group","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-groups/unassignprojectgroupproject","routeSlug":"/api/project-groups/unassignprojectgroupproject","metadata":{"seo":{"title":"Delete Project from Group","description":"Remove a project from a project group, leaving it group-free. The project itself is not deleted. Returns 404 if the project is not assigned to that group. Access: Owner / Executive Manager only."}},"httpPath":"/project-groups/{project_group_id}/unassign/{project_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Projects","link":"/api/projects","routeSlug":"/api/projects","items":[{"label":"Get All Workspace Projects","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/projects/getprojects","routeSlug":"/api/projects/getprojects","metadata":{"seo":{"title":"Get All Workspace Projects","description":"Retrieve all projects in your workspace. Projects are automatically filtered based on your role and permissions. Role-based access: Owners and Executive Managers see all projects; Project Managers and Project Viewers see only managed projects; Team Managers see projects from managed teams; Regular Users see only projects they are assigned to. You can apply additional filters to narrow down results. Each project includes a read-only custom_fields array of {id, name, type, value} objects ([] when no values are set)."}},"httpPath":"/projects","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Project","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/projects/createproject","routeSlug":"/api/projects/createproject","metadata":{"seo":{"title":"Create New Project","description":"Create a new project in your workspace. This endpoint is only accessible to Owners and Executive Managers."}},"httpPath":"/projects","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Project","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/projects/getproject","routeSlug":"/api/projects/getproject","metadata":{"seo":{"title":"Get Single Project","description":"Retrieve detailed information about a specific project in your workspace. Projects are filtered based on your role and permissions. Response includes a read-only custom_fields array of {id, name, type, value} objects ([] when no values are set)."}},"httpPath":"/projects/{projectId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Project","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/projects/updateproject","routeSlug":"/api/projects/updateproject","metadata":{"seo":{"title":"Update Project","description":"Update an existing project in your workspace. This endpoint is only accessible to Owners and Executive Managers."}},"httpPath":"/projects/{projectId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete (Archive) Project","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/projects/deleteproject","routeSlug":"/api/projects/deleteproject","metadata":{"seo":{"title":"Delete (Archive) Project","description":"Delete (archive) a project from your workspace. This is a soft delete - the project can be restored later if needed. This endpoint is only accessible to Owners and Executive Managers."}},"httpPath":"/projects/{projectId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Contracts","link":"/api/contracts","routeSlug":"/api/contracts","items":[{"label":"Get All Workspace Contracts","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/contracts/getcontracts","routeSlug":"/api/contracts/getcontracts","metadata":{"seo":{"title":"Get All Workspace Contracts","description":"Retrieve all contracts (project-member assignments) in your workspace. Contracts are automatically filtered based on your role and permissions: Role-based access: Owners and Executive Managers see all contracts; Project Managers see contracts for managed projects + their own contracts; Team Managers see contracts for managed teams + their own contracts; Regular Users see only their own contracts; Clients see only contracts for projects they have access to. Rate information is only visible if you have permission to view rates AND the project is billable. You can apply additional filters (project_id, user_id, status) to narrow down results."}},"httpPath":"/contracts","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Contract","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/contracts/createcontract","routeSlug":"/api/contracts/createcontract","metadata":{"seo":{"title":"Create New Contract","description":"Create a new contract (assign a member to a project) in your workspace. This endpoint is only accessible to Owners and Executive Managers. Rate information will only be saved if you have permission to view rates."}},"httpPath":"/contracts","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Contract","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/contracts/getcontract","routeSlug":"/api/contracts/getcontract","metadata":{"seo":{"title":"Get Single Contract","description":"Retrieve detailed information about a specific contract in your workspace. Contracts are filtered based on your role and permissions. Rate information is only visible if you have permission to view rates AND the project is billable."}},"httpPath":"/contracts/{contractId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Contract","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/contracts/updatecontract","routeSlug":"/api/contracts/updatecontract","metadata":{"seo":{"title":"Update Contract","description":"Update an existing contract in your workspace. This endpoint is only accessible to Owners and Executive Managers. Rate information will only be updated if you have permission to view rates."}},"httpPath":"/contracts/{contractId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Contract","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/contracts/deletecontract","routeSlug":"/api/contracts/deletecontract","metadata":{"seo":{"title":"Delete Contract","description":"Delete (soft delete) a contract from your workspace. This endpoint is only accessible to Owners and Executive Managers."}},"httpPath":"/contracts/{contractId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Tasks","link":"/api/tasks","routeSlug":"/api/tasks","items":[{"label":"Get All Project Tasks","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettasks","routeSlug":"/api/tasks/gettasks","metadata":{"seo":{"title":"Get All Project Tasks","description":"Retrieve all tasks in a specific project. You can apply filters by status, priority, or parent_id to narrow down results. Use parent_id=null to get only top-level tasks, or parent_id={id} to get subtasks of a specific task."}},"httpPath":"/tasks","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Task","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/createtask","routeSlug":"/api/tasks/createtask","metadata":{"seo":{"title":"Create New Task","description":"Create a new task or subtask in a project. To create a subtask, provide a parent_id pointing to an existing top-level task. Only one level of nesting is supported. Accessible to Owners and Executive Managers."}},"httpPath":"/tasks","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Task","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettask","routeSlug":"/api/tasks/gettask","metadata":{"seo":{"title":"Get Single Task","description":"Retrieve detailed information about a specific task."}},"httpPath":"/tasks/{taskId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Task","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/updatetask","routeSlug":"/api/tasks/updatetask","metadata":{"seo":{"title":"Update Task","description":"Update an existing task. Accessible to Owners and Executive Managers."}},"httpPath":"/tasks/{taskId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Task","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/deletetask","routeSlug":"/api/tasks/deletetask","metadata":{"seo":{"title":"Delete Task","description":"Delete (soft delete) a task from a project. Accessible to Owners and Executive Managers."}},"httpPath":"/tasks/{taskId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Task Assignees","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettaskassignees","routeSlug":"/api/tasks/gettaskassignees","metadata":{"seo":{"title":"Get Task Assignees","description":"Retrieve all users assigned to a specific task."}},"httpPath":"/tasks/{taskId}/assignees","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Assign Task to User","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/assigntask","routeSlug":"/api/tasks/assigntask","metadata":{"seo":{"title":"Assign Task to User","description":"Assign a task to a specific user. The user must be a member of the project."}},"httpPath":"/tasks/{taskId}/assign/{userId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unassign Task from User","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/unassigntask","routeSlug":"/api/tasks/unassigntask","metadata":{"seo":{"title":"Unassign Task from User","description":"Remove a user assignment from a task. workspace_id and project_id are required in the request body — project_id must be the task's project (same as GET/DELETE task and assign). Returns 404 if the user is not currently assigned to the task. Access: Owner / Executive Manager only."}},"httpPath":"/tasks/{taskId}/unassign/{userId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get All Task Statuses","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettaskstatuses","routeSlug":"/api/tasks/gettaskstatuses","metadata":{"seo":{"title":"Get All Task Statuses","description":"Retrieve all task statuses for a workspace. Status IDs are plain integers where the type group = floor(id / 10): 0 = open, 1 = active, 2 = done, 3 = closed. Built-in statuses are 0, 10, 20, and 30. When project_id is supplied, the project's status override is returned; if the project has no override, the workspace defaults are returned. Accessible to Owners and Executive Managers."}},"httpPath":"/task-statuses","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Task Status","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/createtaskstatus","routeSlug":"/api/tasks/createtaskstatus","metadata":{"seo":{"title":"Create New Task Status","description":"Create a new custom task status within a type group. Each type group allows a maximum of 10 statuses. When project_id is supplied, the status is created on the project's status override; if the project has no override yet, one is first materialized as a copy of the current workspace statuses (including any custom or renamed statuses), then the new status is added to it. Otherwise the status is added to the workspace defaults. Accessible to Owners and Executive Managers."}},"httpPath":"/task-statuses","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Task Status","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettaskstatus","routeSlug":"/api/tasks/gettaskstatus","metadata":{"seo":{"title":"Get Single Task Status","description":"Retrieve detailed information about a specific task status. When project_id is supplied, the status is resolved from the project's status override, falling back to workspace defaults. Accessible to Owners and Executive Managers."}},"httpPath":"/task-statuses/{statusId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Task Status","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/updatetaskstatus","routeSlug":"/api/tasks/updatetaskstatus","metadata":{"seo":{"title":"Update Task Status","description":"Update the label and/or color of an existing task status. At least one of text or color must be provided. When project_id is supplied, the update applies to the project's status override. Accessible to Owners and Executive Managers."}},"httpPath":"/task-statuses/{statusId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Task Status","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/deletetaskstatus","routeSlug":"/api/tasks/deletetaskstatus","metadata":{"seo":{"title":"Delete Task Status","description":"Delete a custom task status. Built-in statuses (id % 10 == 0) cannot be deleted. Tasks using the deleted status are moved to reassign_to, or to the group base status when reassign_to is omitted. When project_id is supplied, the deletion applies to the project's status override. Accessible to Owners and Executive Managers."}},"httpPath":"/task-statuses/{statusId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Task Comments","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettaskcomments","routeSlug":"/api/tasks/gettaskcomments","metadata":{"seo":{"title":"Get Task Comments","description":"Retrieve the threaded comments for a task. Only root comments are returned at the top level; each carries its nested replies (threaded via parent_id). workspace_id is required as a query parameter. project_id is derived from the task and is not a parameter."}},"httpPath":"/tasks/{task_id}/comments","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Task Comment","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/createtaskcomment","routeSlug":"/api/tasks/createtaskcomment","metadata":{"seo":{"title":"Create Task Comment","description":"Create a comment on a task. Pass parent_id to post a reply within an existing thread; omit it for a top-level comment. workspace_id is required in the body. project_id is derived from the task and is not a parameter."}},"httpPath":"/tasks/{task_id}/comments","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Task Comment","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/gettaskcomment","routeSlug":"/api/tasks/gettaskcomment","metadata":{"seo":{"title":"Get Single Task Comment","description":"Retrieve a single task comment with its replies and file attachments. workspace_id is required as a query parameter. project_id is derived from the task and is not a parameter."}},"httpPath":"/tasks/{task_id}/comments/{comment_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Task Comment","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/updatetaskcomment","routeSlug":"/api/tasks/updatetaskcomment","metadata":{"seo":{"title":"Update Task Comment","description":"Update the text of a task comment. Only the comment author may edit; a 403 is returned otherwise. workspace_id is required in the body. project_id is derived from the task and is not a parameter."}},"httpPath":"/tasks/{task_id}/comments/{comment_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Task Comment","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/tasks/deletetaskcomment","routeSlug":"/api/tasks/deletetaskcomment","metadata":{"seo":{"title":"Delete Task Comment","description":"Delete a task comment. Deleting a comment cascades to its replies and attached files. Only the comment author may delete; a 403 is returned otherwise. workspace_id is required in the body. project_id is derived from the task and is not a parameter."}},"httpPath":"/tasks/{task_id}/comments/{comment_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Project Viewers","link":"/api/project-viewers","routeSlug":"/api/project-viewers","items":[{"label":"Get All Project Viewers","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/getprojectviewers","routeSlug":"/api/project-viewers/getprojectviewers","metadata":{"seo":{"title":"Get All Project Viewers","description":"Retrieve all project viewers for a specific workspace. Requires workspace_id as query parameter."}},"httpPath":"/project-viewers","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Project Viewer","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/createprojectviewer","routeSlug":"/api/project-viewers/createprojectviewer","metadata":{"seo":{"title":"Create Project Viewer","description":"Create Project Viewer"}},"httpPath":"/project-viewers","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Project Viewer","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/getprojectviewer","routeSlug":"/api/project-viewers/getprojectviewer","metadata":{"seo":{"title":"Get Project Viewer","description":"Get Project Viewer"}},"httpPath":"/project-viewers/{viewerId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Project Viewer","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/deleteprojectviewer","routeSlug":"/api/project-viewers/deleteprojectviewer","metadata":{"seo":{"title":"Delete Project Viewer","description":"Delete Project Viewer"}},"httpPath":"/project-viewers/{viewerId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Restore Project Viewer","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/restoreprojectviewer","routeSlug":"/api/project-viewers/restoreprojectviewer","metadata":{"seo":{"title":"Restore Project Viewer","description":"Restore Project Viewer"}},"httpPath":"/project-viewers/{viewerId}/restore","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Assign Project to Viewer","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/assignprojecttoviewer","routeSlug":"/api/project-viewers/assignprojecttoviewer","metadata":{"seo":{"title":"Assign Project to Viewer","description":"Assign Project to Viewer"}},"httpPath":"/project-viewers/{viewerId}/assign-project","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unassign Project from Viewer","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/project-viewers/unassignprojectfromviewer","routeSlug":"/api/project-viewers/unassignprojectfromviewer","metadata":{"seo":{"title":"Unassign Project from Viewer","description":"Unassign Project from Viewer"}},"httpPath":"/project-viewers/{viewerId}/unassign-project","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Timesheets","link":"/api/timesheets","routeSlug":"/api/timesheets","items":[{"label":"Get All Timesheets","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/timesheets/gettimesheets","routeSlug":"/api/timesheets/gettimesheets","metadata":{"seo":{"title":"Get All Timesheets","description":"Retrieve all timesheets for a specific workspace. Supports filtering by status, date range, user ID, and specific timesheet ID. Results are paginated and can be sorted by creation date."}},"httpPath":"/timesheets","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Timesheet","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/timesheets/gettimesheet","routeSlug":"/api/timesheets/gettimesheet","metadata":{"seo":{"title":"Get Single Timesheet","description":"Retrieve a single timesheet approval with its daily breakdown. Same item shape as GET /timesheets. Requires workspace owner or executive manager permissions."}},"httpPath":"/timesheets/{timesheetId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Approve Timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/timesheets/approvetimesheet","routeSlug":"/api/timesheets/approvetimesheet","metadata":{"seo":{"title":"Approve Timesheet","description":"Approve a submitted timesheet. Only workspace owners and executive managers can approve timesheets. The timesheet must be in 'submitted' status to be approved."}},"httpPath":"/timesheets/{timesheetId}/approve","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Reject Timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/timesheets/rejecttimesheet","routeSlug":"/api/timesheets/rejecttimesheet","metadata":{"seo":{"title":"Reject Timesheet","description":"Reject a submitted timesheet with a reason. Only workspace owners and executive managers can reject timesheets. The timesheet must be in 'submitted' status to be rejected. A reason must be provided."}},"httpPath":"/timesheets/{timesheetId}/reject","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Submit Timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/timesheets/submittimesheet","routeSlug":"/api/timesheets/submittimesheet","metadata":{"seo":{"title":"Submit Timesheet","description":"Submit a timesheet for approval. The timesheet must be in 'pending' or 'rejected' status to be submitted. Once submitted, it will be reviewed by workspace owners or executive managers."}},"httpPath":"/timesheets/{timesheetId}/submit","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unsubmit Timesheet","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/timesheets/unsubmittimesheet","routeSlug":"/api/timesheets/unsubmittimesheet","metadata":{"seo":{"title":"Unsubmit Timesheet","description":"Unsubmit a previously submitted timesheet. This returns the timesheet to 'pending' status, allowing the user to make changes before resubmitting."}},"httpPath":"/timesheets/{timesheetId}/unsubmit","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Time Requests","link":"/api/time-requests","routeSlug":"/api/time-requests","items":[{"label":"Get All Time Requests","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-requests/gettimerequests","routeSlug":"/api/time-requests/gettimerequests","metadata":{"seo":{"title":"Get All Time Requests","description":"Retrieve all time requests for a specific workspace. Requires workspace_id as query parameter."}},"httpPath":"/time-requests","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Time Request","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-requests/createtimerequest","routeSlug":"/api/time-requests/createtimerequest","metadata":{"seo":{"title":"Create Time Request","description":"Create a new time request. The system will use existing logic based on user permissions and workspace auto-approval settings to determine whether the time is added immediately or creates a pending request."}},"httpPath":"/time-requests","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Time Request","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-requests/gettimerequest","routeSlug":"/api/time-requests/gettimerequest","metadata":{"seo":{"title":"Get Single Time Request","description":"Retrieve a single manual time request. Same item shape as GET /time-requests. Requires workspace owner or executive manager permissions."}},"httpPath":"/time-requests/{timeRequestId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Approve Time Request","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-requests/approvetimerequest","routeSlug":"/api/time-requests/approvetimerequest","metadata":{"seo":{"title":"Approve Time Request","description":"Approve a pending time request."}},"httpPath":"/time-requests/{timeRequestId}/approve","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Reject Time Request","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-requests/rejecttimerequest","routeSlug":"/api/time-requests/rejecttimerequest","metadata":{"seo":{"title":"Reject Time Request","description":"Reject a pending time request. Requires a comment explaining the rejection reason."}},"httpPath":"/time-requests/{timeRequestId}/reject","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Leaves","link":"/api/leaves","routeSlug":"/api/leaves","items":[{"label":"Get All Leaves","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/getleaves","routeSlug":"/api/leaves/getleaves","metadata":{"seo":{"title":"Get All Leaves","description":"Retrieve all leave requests for a specific workspace. Requires workspace_id as query parameter."}},"httpPath":"/leaves","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Request Leave","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/createleaverequest","routeSlug":"/api/leaves/createleaverequest","metadata":{"seo":{"title":"Request Leave","description":"Create a leave request for a member against a policy."}},"httpPath":"/leaves","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Leave Balances","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/getleavebalances","routeSlug":"/api/leaves/getleavebalances","metadata":{"seo":{"title":"Get Leave Balances","description":"Per-member remaining balance for each leave policy in the period."}},"httpPath":"/leaves/balances","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Leave Policies","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/getleavepolicies","routeSlug":"/api/leaves/getleavepolicies","metadata":{"seo":{"title":"Get Leave Policies","description":"Workspace leave policies requestable in this workspace."}},"httpPath":"/leaves/policies","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Leave Request","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/getleave","routeSlug":"/api/leaves/getleave","metadata":{"seo":{"title":"Get Single Leave Request","description":"Retrieve a single leave request, including approval steps on multi-level approval workspaces. Same item shape as GET /leaves. Requires workspace owner or executive manager permissions."}},"httpPath":"/leaves/{leaveRequestId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Approve Leave Request","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/approveleaverequest","routeSlug":"/api/leaves/approveleaverequest","metadata":{"seo":{"title":"Approve Leave Request","description":"Approve a pending leave request."}},"httpPath":"/leaves/{leaveRequestId}/approve","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Reject Leave Request","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/leaves/rejectleaverequest","routeSlug":"/api/leaves/rejectleaverequest","metadata":{"seo":{"title":"Reject Leave Request","description":"Reject a pending leave request. A reason is required."}},"httpPath":"/leaves/{leaveRequestId}/reject","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Expenses","link":"/api/expenses","routeSlug":"/api/expenses","items":[{"label":"Get All Expenses","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/expenses/getexpenses","routeSlug":"/api/expenses/getexpenses","metadata":{"seo":{"title":"Get All Expenses","description":"Retrieve all expenses for a specific workspace. Requires workspace_id as query parameter."}},"httpPath":"/expenses","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Expense","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/expenses/createexpense","routeSlug":"/api/expenses/createexpense","metadata":{"seo":{"title":"Create Expense","description":"Create Expense"}},"httpPath":"/expenses","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Expense Categories","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/expenses/getexpensecategories","routeSlug":"/api/expenses/getexpensecategories","metadata":{"seo":{"title":"Get Expense Categories","description":"Get Expense Categories"}},"httpPath":"/expenses/categories","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Expense","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/expenses/getexpense","routeSlug":"/api/expenses/getexpense","metadata":{"seo":{"title":"Get Single Expense","description":"Retrieve a single expense. Same item shape as GET /expenses. Requires workspace owner or executive manager permissions."}},"httpPath":"/expenses/{expenseId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Expense","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/expenses/updateexpense","routeSlug":"/api/expenses/updateexpense","metadata":{"seo":{"title":"Update Expense","description":"Update Expense"}},"httpPath":"/expenses/{expenseId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Expense","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/expenses/deleteexpense","routeSlug":"/api/expenses/deleteexpense","metadata":{"seo":{"title":"Delete Expense","description":"Delete Expense"}},"httpPath":"/expenses/{expenseId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Time Tracking","link":"/api/time-tracking","routeSlug":"/api/time-tracking","items":[{"label":"Start Time Tracking","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-tracking/starttimetracking","routeSlug":"/api/time-tracking/starttimetracking","metadata":{"seo":{"title":"Start Time Tracking","description":"Start time tracking (clock in) for a user. Only workspace owners and executive managers can use this endpoint. They can start tracking for any member in their workspace. If a user is already tracking time, they must stop the current tracker before starting a new one."}},"httpPath":"/time-tracking/start","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Stop Time Tracking","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-tracking/stoptimetracking","routeSlug":"/api/time-tracking/stoptimetracking","metadata":{"seo":{"title":"Stop Time Tracking","description":"Stop time tracking (clock out) for a user. Only workspace owners and executive managers can use this endpoint. They can stop tracking for any member in their workspace. The user must have an active tracker running to stop it."}},"httpPath":"/time-tracking/stop","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Current Running Tracker Data","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-tracking/getcurrenttrackerdata","routeSlug":"/api/time-tracking/getcurrenttrackerdata","metadata":{"seo":{"title":"Get Current Running Tracker Data","description":"Get current running tracker actual time data for a user. Only workspace owners and executive managers can use this endpoint. They can get tracker data for any member in their workspace."}},"httpPath":"/time-tracking/current-data","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Time Entries","link":"/api/time-entries","routeSlug":"/api/time-entries","items":[{"label":"Get Time Entries","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-entries/gettimeentries","routeSlug":"/api/time-entries/gettimeentries","metadata":{"seo":{"title":"Get Time Entries","description":"Retrieve time entries for a workspace. Returns a paginated list of time entries with filters for specific date, user, project, and task. Requires workspace owner or executive manager permissions."}},"httpPath":"/time-entries","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Time Entry","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-entries/createtimeentry","routeSlug":"/api/time-entries/createtimeentry","metadata":{"seo":{"title":"Create Time Entry","description":"Create a new time entry manually. This is useful for adding historical time entries or entries that weren't tracked in real-time. Requires workspace owner or executive manager permissions."}},"httpPath":"/time-entries","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Time Entry","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-entries/gettimeentry","routeSlug":"/api/time-entries/gettimeentry","metadata":{"seo":{"title":"Get Single Time Entry","description":"Retrieve a single completed time entry. Same item shape as GET /time-entries. Requires workspace owner or executive manager permissions."}},"httpPath":"/time-entries/{time_entry_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Time Entry","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-entries/updatetimeentry","routeSlug":"/api/time-entries/updatetimeentry","metadata":{"seo":{"title":"Update Time Entry","description":"Update an existing time entry. You can update the activity description, notes, task, project assignment, date, or time range. Requires workspace owner or executive manager permissions."}},"httpPath":"/time-entries/{time_entry_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Time Entry","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/time-entries/deletetimeentry","routeSlug":"/api/time-entries/deletetimeentry","metadata":{"seo":{"title":"Delete Time Entry","description":"Delete a time entry. This permanently removes the time entry from the system. Requires workspace owner or executive manager permissions."}},"httpPath":"/time-entries/{time_entry_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Reports","link":"/api/reports","routeSlug":"/api/reports","items":[{"label":"Get Tracked Hours Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/gettrackedhoursreport","routeSlug":"/api/reports/gettrackedhoursreport","metadata":{"seo":{"title":"Get Tracked Hours Report","description":"Retrieve tracked hours report data for a workspace. Supports filtering by users, projects, teams, and titles. Data is always grouped by day. Always returns: Day-by-day breakdown grouped by date (date as key), with users array inside each date. Tracked time is returned in minutes (total_minutes field), aggregated across all tracking methods and grouped by user_id, project_id, and contract_id. If user has access to rates (rate_status = 1), also returns total_amount (the amount computed with the pay rate) as an object with currency codes as keys. Additive fields (non-breaking): each user entry also carries bill_amount (a currency-keyed amount computed with the bill rate), plus contract-level pay_rate, bill_rate and weekly_limit (sourced from the active contract; null when there is no active contract). The top-level total object additionally returns total_bill_amount. bill_amount and bill_rate require bill-rate access (bill_rate_status = 1); pay_rate requires rate access (rate_status = 1); weekly_limit is always returned. When user_id is provided: Results are filtered to that specific user only. Date range is limited to maximum 31 days (1 month) when user_id is provided. Security: Only workspace owners and executive managers can access this endpoint."}},"httpPath":"/reports/tracked-hours","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Daily Timeline Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getdailytimelinereport","routeSlug":"/api/reports/getdailytimelinereport","metadata":{"seo":{"title":"Get Daily Timeline Report","description":"Retrieve daily timeline report data for a specific date, paginated by user IDs. Returns time entries with details for each user including start/end times, project, task, activity description, tracking method, and activity metrics.\\n\\nKey Features:\\n- Single date only: This endpoint accepts only one date (not a date range). Date must be within the last year and not more than a year in the future.\\n- Pagination: Results are paginated by user_ids. Default is 30 users per page, maximum 100.\\n- Rate visibility: total_amount and currency fields are only included if the workspace has rate_status = 1 (rate visibility enabled).\\n- Activity metrics: Both user-level and time entry-level activity_level are calculated using the TimelineService::activity() method based on mouse, keyboard, and scroll actions.\\n- Timezone handling: Times are returned in ISO 8601 format with timezone offset based on the workspace owner's system_timezone.\\n- Security: Only workspace owners and executive managers can access this endpoint."}},"httpPath":"/reports/daily-timeline","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Daily Activity Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getdailyactivityreport","routeSlug":"/api/reports/getdailyactivityreport","metadata":{"seo":{"title":"Get Daily Activity Report","description":"Retrieve the minute-level daily-activity breakdown for a single member on a single day. Returns the tracked-time segments of the day, each broken down into rows covering the active app/website, mouse/keyboard/scroll counts, per-row activity level, project/task and description, and (on Plus/Premium plans) the active window title and URL. The day's total_times (tracked/manual/leave/idle/break/holiday minutes) and overall activity_level are included alongside the segments.\\n\\nKey Features:\\n- Single member, single date: both user_id and date are required; the report always covers exactly one calendar day.\\n- Grouping: group_by controls row aggregation — time (default; merges identical rows across the whole day), interval (merges within each segment), or minute (raw per-minute rows).\\n- Columns: columns is a JSON object of group-by flags (project, task_title, description, app, url, trackType, active_window_title, category).\\n- Pagination (opt-in): intended for the large minute view. When page/per_page are supplied, data becomes a flat array of rows plus a pagination object; without them the full segmented result is returned.\\n- Data source: this report is served by the WebWork realtime tracking service; this endpoint proxies it.\\n- Security: only workspace owners and executive managers can access this endpoint."}},"httpPath":"/reports/daily-activity","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Activity Level Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getactivitylevelreport","routeSlug":"/api/reports/getactivitylevelreport","metadata":{"seo":{"title":"Get Activity Level Report","description":"Retrieve activity level report data for a date range, paginated by day. Returns activity level percentage per user per day, with overall statistics across all users and days."}},"httpPath":"/reports/activity-level","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Task Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/gettaskreport","routeSlug":"/api/reports/gettaskreport","metadata":{"seo":{"title":"Get Task Report","description":"Retrieve task-based time tracking report data for a date range, paginated by user. Returns time tracked per task for each user, with daily breakdown and overall task breakdown."}},"httpPath":"/reports/task-report","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Daily Attendance Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getdailyattendancereport","routeSlug":"/api/reports/getdailyattendancereport","metadata":{"seo":{"title":"Get Daily Attendance Report","description":"Retrieve daily attendance report data for a specific date, paginated by user. Returns attendance information including statuses, times, breaks, and productivity metrics for each user."}},"httpPath":"/reports/daily-attendance","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Activity Description Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getactivitydescriptionreport","routeSlug":"/api/reports/getactivitydescriptionreport","metadata":{"seo":{"title":"Get Activity Description Report","description":"Retrieve activity description-based time tracking report data for a date range, paginated by user. Returns time tracked per activity description (memo) for each user, with daily breakdown and overall breakdown."}},"httpPath":"/reports/activity-description","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Apps & Websites Overview Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getappswebsitesoverviewreport","routeSlug":"/api/reports/getappswebsitesoverviewreport","metadata":{"seo":{"title":"Get Apps & Websites Overview Report","description":"Retrieve the Apps & Websites usage \"Overview\" report for a workspace. Each row represents app/website usage aggregated per member/project (and other visible dimensions), matching the dashboard's Apps & Websites Overview tab."}},"httpPath":"/reports/apps-websites","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Real Time Report (live snapshot)","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getrealtimereport","routeSlug":"/api/reports/getrealtimereport","metadata":{"seo":{"title":"Get Real Time Report (live snapshot)","description":"Retrieve a LIVE snapshot of every workspace member — exactly what the Analyze → Real Time page shows. One row per member INCLUDING offline, absent and on-leave members, covering ALL trackers (desktop, web browser, extension, mobile, kiosk), since the realtime presence store is shared by all of them."}},"httpPath":"/reports/real-time","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get GPS Tracking Report","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/reports/getgpstrackingreport","routeSlug":"/api/reports/getgpstrackingreport","metadata":{"seo":{"title":"Get GPS Tracking Report","description":"Retrieve the raw GPS points members recorded while tracking time — the data behind Analyze → Geolocation → Data. One row per stored point: the member, the coordinates, when it was recorded, the project/task being tracked at the time, and which job site (geofence) contains the point. No sort parameter — rows come back newest point first."}},"httpPath":"/reports/gps-tracking","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Job Sites","link":"/api/job-sites","routeSlug":"/api/job-sites","items":[{"label":"Get All Job Sites","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/job-sites/getjobsites","routeSlug":"/api/job-sites/getjobsites","metadata":{"seo":{"title":"Get All Job Sites","description":"List the workspace's job sites (geofences), paginated — each row's id is the job_site_id the GPS tracking report filters on. Optional filters: project_id and search (substring of the name; % and _ are matched literally). sort_by = name / radius / created_at / updated_at with order_by; ties break on id, so a paginated walk never drops or repeats a row. An unassigned site applies to EVERYONE — read applies_to_everyone rather than inferring coverage from an empty members array. current_members is live: who is inside right now, from each member's last known position within the past hour. Access: Owner/Executive Manager; 404 when Mobile GPS Tracking is off."}},"httpPath":"/job-sites","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Job Site","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/job-sites/createjobsite","routeSlug":"/api/job-sites/createjobsite","metadata":{"seo":{"title":"Create Job Site","description":"Create a job site: a circle defined by name, latitude (-90..90), longitude (-180..180) and radius in metres (50–50000, whole numbers). Coordinates are stored as decimal(10,7); the response returns them as 4-decimal display strings (the dashboard form's toFixed(4)), with the full stored precision in google_maps_url. name/address max 191 characters; address is free text, never geocoded. Leaving member_ids empty applies the site to EVERYONE. A project_id or member_ids entry from outside the workspace returns 404 instead of being silently dropped. Matching is recomputed per request, so a new site also applies to points recorded before it existed. Access: Owner/Executive Manager; 404 when Mobile GPS Tracking is off."}},"httpPath":"/job-sites","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Job Site","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/job-sites/getjobsite","routeSlug":"/api/job-sites/getjobsite","metadata":{"seo":{"title":"Get Single Job Site","description":"Retrieve one job site with its project, assigned members, and who is inside it right now. A malformed or cross-workspace id answers 422; a deleted site answers 404. Access: Owner/Executive Manager; 404 when Mobile GPS Tracking is off."}},"httpPath":"/job-sites/{job_site_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Job Site","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/job-sites/updatejobsite","routeSlug":"/api/job-sites/updatejobsite","metadata":{"seo":{"title":"Update Job Site","description":"Update a job site. PARTIAL — send only the fields that change; omitted fields keep their value, and an empty body returns 422. Member assignments are untouched unless member_ids is present; an empty array clears them, widening the site to everyone unless the dashboard has scoped it to a team (team assignments are never touched here). Same bounds as create. Moving a site re-attributes already-recorded points. Access: Owner/Executive Manager; 404 when Mobile GPS Tracking is off."}},"httpPath":"/job-sites/{job_site_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Job Site","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/job-sites/deletejobsite","routeSlug":"/api/job-sites/deletejobsite","metadata":{"seo":{"title":"Delete Job Site","description":"Hard-delete a job site and its assignments — there is no soft delete. GPS points survive; the report just stops attributing them to the site, for past dates as well as future ones. Access: Owner/Executive Manager; 404 when Mobile GPS Tracking is off."}},"httpPath":"/job-sites/{job_site_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Screenshots","link":"/api/screenshots","routeSlug":"/api/screenshots","items":[{"label":"Get Screenshots","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/screenshots/getscreenshots","routeSlug":"/api/screenshots/getscreenshots","metadata":{"seo":{"title":"Get Screenshots","description":"Retrieve tracked screenshots for a workspace. Returns a paginated list ordered oldest-first, with member, project, and task context for every capture. Filterable by member, project, task, and date range; when no date range is given, defaults to today in the workspace owner's timezone. Requires workspace owner or executive manager permissions."}},"httpPath":"/screenshots","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Screenshot","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/screenshots/getscreenshot","routeSlug":"/api/screenshots/getscreenshot","metadata":{"seo":{"title":"Get Single Screenshot","description":"Retrieve a single tracked screenshot with its member / project / task context. To get the image itself, use GET /screenshots/{screenshot_id}/download. Requires workspace owner or executive manager permissions."}},"httpPath":"/screenshots/{screenshot_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Download Screenshot Image","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/screenshots/downloadscreenshot","routeSlug":"/api/screenshots/downloadscreenshot","metadata":{"seo":{"title":"Download Screenshot Image","description":"Download the full-size screenshot image. The image is fetched from the media storage server-side and streamed back as a file attachment, so no direct media URL is ever exposed. Requires workspace owner or executive manager permissions."}},"httpPath":"/screenshots/{screenshot_id}/download","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Shifts","link":"/api/shifts","routeSlug":"/api/shifts","items":[{"label":"Get All Shifts","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/getshifts","routeSlug":"/api/shifts/getshifts","metadata":{"seo":{"title":"Get All Shifts","description":"List workspace work-schedule shifts (paginated). Optional filters: member_id (only shifts a given user is assigned to) and a date window via week (any date in the ISO week) or date_from/date_to. Each logical shift is identified by its uuid. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager. Workspaces without shifts access, or that are suspended / past trial, get 403."}},"httpPath":"/shifts","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create New Shift","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/createshift","routeSlug":"/api/shifts/createshift","metadata":{"seo":{"title":"Create New Shift","description":"Create a new shift. name must be unique per workspace (max 100). Times are given in the shift's own timezone (IANA). For shift_type: fixed supply a single start_time/end_time/min_hours; for shift_type: flexible supply a per-day schedule. working_days is required for recurring (repeat: weekly|biweekly) fixed shifts. A shift whose window collides with an existing shift for one of the selected members returns 422 with errors.conflicts. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager."}},"httpPath":"/shifts","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Shift","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/getshift","routeSlug":"/api/shifts/getshift","metadata":{"seo":{"title":"Get Single Shift","description":"Retrieve a single shift by its uuid. Owner-scoped. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager."}},"httpPath":"/shifts/{shift_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Shift","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/updateshift","routeSlug":"/api/shifts/updateshift","metadata":{"seo":{"title":"Update Shift","description":"Update a shift. All create fields are accepted (each optional on update); times are interpreted in the supplied timezone. A window that collides with an existing shift for one of the selected members returns 422 with errors.conflicts. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager."}},"httpPath":"/shifts/{shift_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Shift","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/deleteshift","routeSlug":"/api/shifts/deleteshift","metadata":{"seo":{"title":"Delete Shift","description":"Soft-delete a shift and all rows sharing its uuid. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager."}},"httpPath":"/shifts/{shift_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Assign Member to Shift","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/assignshiftmember","routeSlug":"/api/shifts/assignshiftmember","metadata":{"seo":{"title":"Assign Member to Shift","description":"Assign a member to a shift. shift_id is the shift uuid; member_id is a raw integer user id that must belong to the workspace. Assign is add-only: re-assigning a member already on the shift returns 422 (not a 200 no-op). The same shift-overlap guard as create/update applies — if joining would double-book the member against an overlapping shift, the call is rejected 422 with a conflicts list. On success the full shift object is returned. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager."}},"httpPath":"/shifts/{shift_id}/assign/{member_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unassign Member from Shift","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/shifts/unassignshiftmember","routeSlug":"/api/shifts/unassignshiftmember","metadata":{"seo":{"title":"Unassign Member from Shift","description":"Remove a member from a shift. shift_id is the shift uuid; member_id is a raw integer user id. The shift is never deleted by this endpoint: unassigning the last remaining member is refused with 409 (message: \"Cannot unassign the last member of a shift. Use DELETE /shifts/{shift_id} to remove the shift.\") — use the explicit delete endpoint instead. Returns 404 if the shift is missing or the member is not assigned. Access: PAID feature — Plus plan and above OR the Shift add-on — plus Owner/Executive Manager."}},"httpPath":"/shifts/{shift_id}/unassign/{member_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Webhooks","link":"/api/webhooks","routeSlug":"/api/webhooks","items":[{"label":"Get All Webhooks","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/webhooks/getwebhooks","routeSlug":"/api/webhooks/getwebhooks","metadata":{"seo":{"title":"Get All Webhooks","description":"Retrieve all webhooks for a specific workspace. Requires workspace_id as query parameter."}},"httpPath":"/webhooks","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Webhook","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/webhooks/createwebhook","routeSlug":"/api/webhooks/createwebhook","metadata":{"seo":{"title":"Create Webhook","description":"Create Webhook"}},"httpPath":"/webhooks","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Webhook","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/webhooks/getwebhook","routeSlug":"/api/webhooks/getwebhook","metadata":{"seo":{"title":"Get Webhook","description":"Get Webhook"}},"httpPath":"/webhooks/{webhookId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Webhook","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/webhooks/updatewebhook","routeSlug":"/api/webhooks/updatewebhook","metadata":{"seo":{"title":"Update Webhook","description":"Update Webhook"}},"httpPath":"/webhooks/{webhookId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Webhook","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/webhooks/deletewebhook","routeSlug":"/api/webhooks/deletewebhook","metadata":{"seo":{"title":"Delete Webhook","description":"Delete Webhook"}},"httpPath":"/webhooks/{webhookId}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Asset Management","link":"/api/asset-management","routeSlug":"/api/asset-management","items":[{"label":"List Assets","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/getassets","routeSlug":"/api/asset-management/getassets","metadata":{"seo":{"title":"List Assets","description":"Retrieve a paginated list of assets in the specified workspace. Each asset is returned with its denormalized relationships: assigned user (with email and full name), creator, asset type, and any custom field values keyed by slug. Access: Requires Plus plan or higher and Owner or Executive Manager role on the workspace."}},"httpPath":"/assets","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Asset","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/createasset","routeSlug":"/api/asset-management/createasset","metadata":{"seo":{"title":"Create Asset","description":"Create a new asset in the workspace. Required fields are workspace_id, category, and name. Optional fields include type_id (encrypted asset type), brand, model, notes, free-form properties (validated against the category's known property keys), and custom_fields (object keyed by custom field slug). Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/assets","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Retrieve Asset","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/getasset","routeSlug":"/api/asset-management/getasset","metadata":{"seo":{"title":"Retrieve Asset","description":"Retrieve a single asset by its encrypted ID. Returns the asset with denormalized relationships: assigned user (with email and full name), creator, asset type, and custom field values keyed by slug. Access: Requires Plus plan or higher and Owner or Executive Manager role on the workspace."}},"httpPath":"/assets/{asset_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Asset","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/updateasset","routeSlug":"/api/asset-management/updateasset","metadata":{"seo":{"title":"Update Asset","description":"Update an existing asset. Editable fields include name, brand, model, notes, type_id, free-form properties, and custom_fields (keyed by slug). The category field is immutable once set and any value sent for it is ignored. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/assets/{asset_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Asset","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/deleteasset","routeSlug":"/api/asset-management/deleteasset","metadata":{"seo":{"title":"Delete Asset","description":"Soft-delete an asset. The asset is marked deleted but preserved for audit and can be brought back via POST /assets/{asset_id}/restore. Any current assignment is cleared. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/assets/{asset_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Restore Asset","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/restoreasset","routeSlug":"/api/asset-management/restoreasset","metadata":{"seo":{"title":"Restore Asset","description":"Restore a previously soft-deleted asset, making it active again. Returns 422 if the asset is not currently deleted. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/assets/{asset_id}/restore","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Assign Asset","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/assignasset","routeSlug":"/api/asset-management/assignasset","metadata":{"seo":{"title":"Assign Asset","description":"Assign an asset to a workspace user. The target user must belong to the same workspace. Re-assigning replaces the previous assignee. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/assets/{asset_id}/assign","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Unassign Asset","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/unassignasset","routeSlug":"/api/asset-management/unassignasset","metadata":{"seo":{"title":"Unassign Asset","description":"Clear the current assignee of an asset. Idempotent: succeeds even if the asset is already unassigned. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/assets/{asset_id}/unassign","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"List Asset Types","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/getassettypes","routeSlug":"/api/asset-management/getassettypes","metadata":{"seo":{"title":"List Asset Types","description":"List all asset types available to the workspace. The result combines built-in system types (e.g. Laptop, Phone, Router) with workspace-defined custom types. Use the category filter to narrow by hardware family. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-types","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Asset Type","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/createassettype","routeSlug":"/api/asset-management/createassettype","metadata":{"seo":{"title":"Create Asset Type","description":"Create a new workspace-custom asset type within the given category. The type will have is_system: false and is editable/deletable by the workspace. The name must be unique within the workspace+category combination. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-types","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Retrieve Asset Type","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/getassettype","routeSlug":"/api/asset-management/getassettype","metadata":{"seo":{"title":"Retrieve Asset Type","description":"Retrieve a single asset type by its encrypted ID. Both system and workspace-custom types are accessible. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-types/{type_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Asset Type","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/updateassettype","routeSlug":"/api/asset-management/updateassettype","metadata":{"seo":{"title":"Update Asset Type","description":"Rename a workspace-custom asset type. Returns 403 if the target type is a system type (system types are read-only). The new name must be unique within the same workspace+category. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-types/{type_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Asset Type","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/deleteassettype","routeSlug":"/api/asset-management/deleteassettype","metadata":{"seo":{"title":"Delete Asset Type","description":"Delete a workspace-custom asset type. Returns 403 for system types. Returns 409 if any asset currently references this type, with in_use_count indicating how many; reassign or delete those assets first. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-types/{type_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"List Custom Fields","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/getassetcustomfields","routeSlug":"/api/asset-management/getassetcustomfields","metadata":{"seo":{"title":"List Custom Fields","description":"List all custom field definitions for the workspace. Custom fields let you attach typed metadata (text, number, date, checkbox, dropdown) to assets. Use the optional category filter to retrieve only fields scoped to a specific hardware category; fields with category: null apply to all categories. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-custom-fields","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Custom Field","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/createassetcustomfield","routeSlug":"/api/asset-management/createassetcustomfield","metadata":{"seo":{"title":"Create Custom Field","description":"Define a new custom field for assets. The slug is auto-derived from name (lowercase, dash-separated) if omitted, and is the key used when sending values via custom_fields on the assets endpoints. The type is immutable after creation. For type: dropdown, options is required and must be a non-empty array of strings. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-custom-fields","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Retrieve Custom Field","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/getassetcustomfield","routeSlug":"/api/asset-management/getassetcustomfield","metadata":{"seo":{"title":"Retrieve Custom Field","description":"Retrieve a single custom field definition by its encrypted ID. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-custom-fields/{field_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Custom Field","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/updateassetcustomfield","routeSlug":"/api/asset-management/updateassetcustomfield","metadata":{"seo":{"title":"Update Custom Field","description":"Update a custom field definition. The type is immutable: any attempt to change it returns 422. For dropdown fields you may add/edit/remove options. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-custom-fields/{field_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Custom Field","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/asset-management/deleteassetcustomfield","routeSlug":"/api/asset-management/deleteassetcustomfield","metadata":{"seo":{"title":"Delete Custom Field","description":"Delete a custom field definition. All values stored under this field on every asset are also deleted (cascade). This is irreversible. Access: Plus plan + Owner/Executive Manager."}},"httpPath":"/asset-custom-fields/{field_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"Custom Fields","link":"/api/custom-fields","routeSlug":"/api/custom-fields","items":[{"label":"List Custom Fields","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/custom-fields/getcustomfields","routeSlug":"/api/custom-fields/getcustomfields","metadata":{"seo":{"title":"List Custom Fields","description":"List workspace custom-field definitions. Use the optional target filter to return only fields scoped to project, task, or member. Fields are owner-scoped. Access: higher-tier plan + Owner/Executive Manager."}},"httpPath":"/custom-fields","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Create Custom Field","deprecated":false,"httpVerb":"post","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/custom-fields/createcustomfield","routeSlug":"/api/custom-fields/createcustomfield","metadata":{"seo":{"title":"Create Custom Field","description":"Define a new custom field. type and target are immutable after creation. For type: dropdown, options is required and must be a non-empty array of strings (max 10, each ≤255 chars); options are deduplicated and empties are stripped. A maximum of 20 fields per target is allowed. Access: higher-tier plan + Owner/Executive Manager."}},"httpPath":"/custom-fields","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Get Single Custom Field","deprecated":false,"httpVerb":"get","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/custom-fields/getcustomfield","routeSlug":"/api/custom-fields/getcustomfield","metadata":{"seo":{"title":"Get Single Custom Field","description":"Retrieve a single custom field definition by its encrypted ID. Owner-scoped. Access: higher-tier plan + Owner/Executive Manager."}},"httpPath":"/custom-fields/{field_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Update Custom Field","deprecated":false,"httpVerb":"put","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/custom-fields/updatecustomfield","routeSlug":"/api/custom-fields/updatecustomfield","metadata":{"seo":{"title":"Update Custom Field","description":"Update a custom field definition. Only name and (for dropdown fields) options are editable — type and target are immutable and any attempt to change them returns 422. Access: higher-tier plan + Owner/Executive Manager."}},"httpPath":"/custom-fields/{field_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"label":"Delete Custom Field","deprecated":false,"httpVerb":"delete","isAdditionalOperation":false,"isWebhook":false,"type":"link","link":"/api/custom-fields/deletecustomfield","routeSlug":"/api/custom-fields/deletecustomfield","metadata":{"seo":{"title":"Delete Custom Field","description":"Delete a custom field definition. All values stored under this field on every project/task/member are also deleted (cascade). This is irreversible. Access: higher-tier plan + Owner/Executive Manager."}},"httpPath":"/custom-fields/{field_id}","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}],"version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"group","label":"MCP Connector","items":[{"type":"link","fsPath":"@v2/mcp-connector/index.md","metadata":{"type":"markdown"},"label":"Introduction","link":"/mcp-connector","routeSlug":"/mcp-connector","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"},{"type":"link","fsPath":"@v2/mcp-connector/quickstart.md","metadata":{"type":"markdown"},"label":"Quickstart","link":"/mcp-connector/quickstart","routeSlug":"/mcp-connector/quickstart","version":"v2","isDefault":true,"versionFolderId":"8a5edab2"}]}]}