Skip to content

Every route ​

Every route the server registers that is not documented in full above, with every optional module switched on. internal routes are not for integrations; every /api/v1 route is one unless the meta file says otherwise. undocumented routes have no description here yet; nothing about them is promised.

The Auth column is the guard the route sits behind. Session or token routes accept the web app's session or an API token. Session routes refuse a token. Instance admin routes are for the person who runs the server. No login guard routes are sign-in and sign-up, pages opened by a secret link, and endpoints that check a credential of their own, such as /mcp and /scim/v2. A handler can refuse more than its guard does.

Version 2 ​

MethodPathAuthStatusSummary
GET/api/v2/agent-sessionsSession or tokeninternalLists the outside agent sessions of a task.
POST/api/v2/agent-sessionsSession or tokeninternalHands a task to an outside agent.
GET/api/v2/agent-sessions/endpointsSession or tokeninternalReads where outside agents are reached.
PUT/api/v2/agent-sessions/endpointsSession or tokeninternalChanges where outside agents are reached.
POST/api/v2/agentsSession or tokenundocumentedCreates an agent.
PUT/api/v2/agents/:idSession or tokenundocumentedChanges an agent.
DELETE/api/v2/agents/:idSession or tokenundocumentedDeletes an agent.
POST/api/v2/agents/:id/pauseSession or tokenundocumentedPauses an agent.
POST/api/v2/agents/:id/resumeSession or tokenundocumentedResumes an agent.
GET/api/v2/agents/:id/revisionsSession or tokenundocumentedLists an agent's revisions.
POST/api/v2/agents/:id/revisionsSession or tokenundocumentedCreates a revision of an agent.
GET/api/v2/agents/:id/revisions/:nSession or tokenundocumentedReads one revision.
POST/api/v2/agents/:id/revisions/:n/promoteSession or tokenundocumentedMakes a revision the live one.
POST/api/v2/agents/:id/revisions/:n/rollbackSession or tokenundocumentedCopies an older revision forward and makes it live.
GET/api/v2/agents/:id/schedulesSession or tokenundocumentedLists an agent's schedules.
POST/api/v2/agents/:id/schedulesSession or tokenundocumentedCreates a schedule for an agent.
PUT/api/v2/agents/:id/schedules/:scheduleIdSession or tokenundocumentedChanges a schedule.
DELETE/api/v2/agents/:id/schedules/:scheduleIdSession or tokenundocumentedDeletes a schedule.
GET/api/v2/agents/accountSession or tokenundocumentedReads the caller's linked AI account.
PUT/api/v2/agents/accountSession or tokenundocumentedLinks the caller's AI account.
DELETE/api/v2/agents/accountSession or tokenundocumentedUnlinks the caller's AI account.
GET/api/v2/agents/alertsSession or tokenundocumentedOpen agent incidents and recently resolved ones.
POST/api/v2/agents/alerts/evaluateSession or tokenundocumentedRuns the alert check now.
GET/api/v2/agents/budgetSession or tokenundocumentedThis month's agent spend against the budget.
GET/api/v2/agents/changesSessionundocumentedWhat the caller's own connected agent just changed, for the audit ids in ids (at most 50), with whether each can still be undone. For a signed-in person.
POST/api/v2/agents/chat/directSession or tokenundocumentedOpens the caller's conversation with an agent.
GET/api/v2/agents/chat/usableSession or tokenundocumentedThe agents the caller may mention in a conversation.
GET/api/v2/agents/connectedSessionundocumentedEach member's connected AI, for a signed-in member. With taskId, only the caller's own AI, and only where the caller may hand that task to it.
POST/api/v2/agents/draftSession or tokenundocumentedDrafts a new agent; nothing is stored.
GET/api/v2/agents/manifestSession or tokenundocumentedWhat workflows and rules bind an agent by.
PUT/api/v2/agents/memory/:idSession or tokenundocumentedChanges a remembered item.
GET/api/v2/agents/memory/project/:projectIdSession or tokenundocumentedReads what agents remember about a project.
POST/api/v2/agents/memory/project/:projectIdSession or tokenundocumentedAdds something for agents to remember about a project.
GET/api/v2/agents/metricsSession or tokenundocumentedAgent run metrics over a window.
GET/api/v2/agents/modelsSession or tokenundocumentedThe models an agent may be pinned to.
POST/api/v2/agents/pause-allSession or tokenundocumentedPauses every agent.
GET/api/v2/agents/pipelineSession or tokenundocumentedTasks an agent has worked on.
GET/api/v2/agents/policySession or tokenundocumentedReads the workspace's agent policy.
PUT/api/v2/agents/policySession or tokenundocumentedChanges the workspace's agent policy.
GET/api/v2/agents/preferencesSession or tokenundocumentedReads the caller's own agent preferences.
PUT/api/v2/agents/preferencesSession or tokenundocumentedChanges the caller's own agent preferences.
GET/api/v2/agents/project-limits/:projectIdSession or tokenundocumentedReads a project's limits for agents: how many may work at once (atOnce) and whether agents are paused there (paused), with the defaults and the allowed range.
PUT/api/v2/agents/project-limits/:projectIdSessionundocumentedChanges a project's limits for agents. Send atOnce, paused or both. Pausing takes held work-queue items back and stops the project's running agent runs. For an owner or admin who is signed in.
GET/api/v2/agents/project-manager/:projectIdSession or tokenundocumentedReads whether a project's manager is on, and the findings from its daily look that the caller may open.
PUT/api/v2/agents/project-manager/:projectIdSessionundocumentedTurns a project's manager on or off (on). Turning it on looks at the project once straight away. For an owner or admin who is signed in.
GET/api/v2/agents/project-policy/:projectIdSession or tokenundocumentedReads a project's policy for agents: whether an agent may close a task (done) and how far a connected agent may go on its own (connected), with the workspace defaults and the policy in force.
PUT/api/v2/agents/project-policy/:projectIdSessionundocumentedChanges a project's policy for agents. Send done, connected or both. For an owner or admin who is signed in.
POST/api/v2/agents/proposalsSession or tokenundocumentedFiles a proposal. Only an agent does, in its own name.
POST/api/v2/agents/proposals/:id/approveSession or tokenundocumentedApproves a proposal.
POST/api/v2/agents/proposals/:id/declineSession or tokenundocumentedDeclines a proposal.
POST/api/v2/agents/proposals/:id/undoSession or tokenundocumentedUndoes an approved proposal.
GET/api/v2/agents/registrySession or tokenundocumentedThe actions an agent may take.
GET/api/v2/agents/releaseSession or tokenundocumentedThe release candidate agents have prepared.
GET/api/v2/agents/reportsSession or tokenundocumentedThe reports delivered to the caller, newest first.
GET/api/v2/agents/reports/:idSession or tokenundocumentedReads one report.
GET/api/v2/agents/rolesSession or tokenundocumented
PUT/api/v2/agents/roles/:blueprint/:slug/playbookSession or tokenundocumented
DELETE/api/v2/agents/roles/:blueprint/:slug/playbookSession or tokenundocumented
GET/api/v2/agents/roles/:blueprint/:slug/skillSession or tokenundocumented
GET/api/v2/agents/routableSession or tokenundocumentedOpen tasks the caller can see, for routing to an agent.
GET/api/v2/agents/routing-policySession or tokenundocumentedReads which model each kind of task prefers.
PUT/api/v2/agents/routing-policySession or tokenundocumentedChanges which model each kind of task prefers.
GET/api/v2/agents/runnableSession or tokenundocumentedThe agents the caller may start on a task.
POST/api/v2/agents/runsSession or tokenundocumentedStarts an agent on a task.
GET/api/v2/agents/runs/:id/replaySession or tokenundocumentedThe prompts and raw responses of a run, for owners and admins.
POST/api/v2/agents/runs/:id/revertSession or tokenundocumentedUndoes what a run changed.
POST/api/v2/agents/runs/:id/stopSession or tokenundocumentedStops a run.
GET/api/v2/agents/runs/summarySession or tokenundocumentedThe open runs and counts by status.
GET/api/v2/agents/settingsSession or tokenundocumentedReads the workspace's agent settings.
PUT/api/v2/agents/settingsSession or tokenundocumentedChanges the workspace's agent settings.
GET/api/v2/agents/skillsSession or tokenundocumentedLists skills.
POST/api/v2/agents/skillsSession or tokenundocumentedCreates a skill.
GET/api/v2/agents/skills/:keySession or tokenundocumentedReads a skill.
PUT/api/v2/agents/skills/:keySession or tokenundocumentedChanges a skill.
DELETE/api/v2/agents/skills/:keySession or tokenundocumentedRetires a skill.
POST/api/v2/agents/skills/:key/dry-runSession or tokenundocumentedShows what a skill would read and do, without doing it.
GET/api/v2/agents/skills/cataloguesSession or tokenundocumentedThe skill catalogues.
GET/api/v2/agents/skills/egress-checkSessionundocumentedWhether a host is on the workspace's allowed list.
GET/api/v2/agents/spendSession or tokenundocumentedWhat each agent spent in a month.
GET/api/v2/agents/standing-approvals/:projectIdSessionundocumentedThe standing approvals ("Always do this") of a project: every one for an owner or admin, the caller's own for a member. For a signed-in person.
DELETE/api/v2/agents/standing-approvals/:projectId/:idSessionundocumentedRemoves a standing approval. Its maker, an owner or an admin may remove it. For a signed-in person.
GET/api/v2/agents/team/standupSession or tokenundocumentedThe caller's own standup, from their activity.
POST/api/v2/agents/work-queue/:itemId/take-backSessionundocumentedTakes a work-queue item back from the agent that holds it.
GET/api/v2/agents/work-queue/heldSession or tokenundocumentedThe tasks an agent holds from the work queue right now, among the tasks the caller can open: the task, its project, the agent's name and since when.
GET/api/v2/agents/work-queue/task/:taskIdSession or tokenundocumentedWhat the work queue holds about a task: its items, which connected agent has claimed one, and whether the caller may hand the task over.
POST/api/v2/agents/work-queue/task/:taskId/hand-overSessionundocumentedPuts a task in the work queue for a connected agent to pick up, in a project whose manager is on.
POST/api/v2/agents/workspace-guideSession or tokenundocumented
GET/api/v2/ai-switchSession or tokeninternalWhether AI is on for the workspace.
PUT/api/v2/ai-switchSessioninternalTurns AI on or off for the workspace.
GET/api/v2/api-tokensSessioninternalAny signed-in member of the workspace may call it, and it lists only that person's own tokens. Answers with data (each token's name, prefix, scopes, state and dates, never the secret) and policy.
POST/api/v2/api-tokensSessioninternalAny signed-in member of the workspace may call it, for the caller's own token. Reads name (string), scopes (list from the scopes the server offers) and expiresInDays (number) from the body. Answers with data: the token with its secret, shown once.
PUT/api/v2/api-tokens/:idSessioninternalOnly the person who owns the token. Reads name (string) and active (boolean) from the body and changes the ones sent; a body with neither answers Nothing to update.. Answers with data: the token.
DELETE/api/v2/api-tokens/:idSessioninternalOnly the person who owns the token; any other id answers Token not found.. Removes the token and its activity log. Answers with statusText Token deleted. and no data.
GET/api/v2/api-tokens/:id/logsSessioninternalOnly the person who owns the token; any other id answers Token not found.. Answers with data: the latest 50 calls made with the token, newest first.
POST/api/v2/api-tokens/:id/renewSessioninternalOnly the person who owns the token, and not with an API token (403). A token that was revoked cannot be renewed. Answers with data: the token with a new secret, shown once, and a new end date.
GET/api/v2/api-tokens/ai-connectionSessioninternalWhether the signed-in person's own AI app has connected to this workspace, when it last called, and which groups of tools this server offers it. Never a token or an app's name.
POST/api/v2/api-tokens/mcpSessioninternalAny signed-in member of the workspace, and not with an API token (403). Reads name (string), mode and provider (strings), projectIds (id list), expiresInDays (number), label (string), scopes and grants (lists) from the body; the account mode must be one the workspace allows. Answers with data: the token, shown once, and the address of the MCP server.
GET/api/v2/api-tokens/needing-expirySessioninternalOwners and admins only, and not with an API token (403). Answers with data: tokens in the workspace that have no expiry date, and the token policy; an empty list while the strict token policy is off.
GET/api/v2/api-tokens/step-credentialsSessioninternalAny member of the workspace, and not with an API token (403). Answers with data: the live step credentials, owners and admins seeing all of them and others the ones they started, and policy; an empty list while step credentials are off.
GET/api/v2/assignment-rules/dispatcher/company/flow-boardSession or tokenundocumented
GET/api/v2/assignment-rules/dispatcher/company/org-chartSession or tokenundocumented
GET/api/v2/assignment-rules/dispatcher/project/:projectIdSession or tokenundocumented
PUT/api/v2/assignment-rules/dispatcher/project/:projectIdSession or tokenundocumented
GET/api/v2/assignment-rules/dispatcher/project/:projectId/needs-routingSession or tokenundocumented
POST/api/v2/assignment-rules/dispatcher/project/:projectId/rulesSession or tokenundocumented
GET/api/v2/assignment-rules/dispatcher/task/:taskIdSession or tokenundocumented
POST/api/v2/assignment-rules/dispatcher/task/:taskId/decisions/:decisionId/acceptSession or tokenundocumented
POST/api/v2/assignment-rules/dispatcher/task/:taskId/decisions/:decisionId/dismissSession or tokenundocumented
POST/api/v2/assignment-rules/dispatcher/task/:taskId/decisions/:decisionId/routeSession or tokenundocumented
GET/api/v2/assignment-rules/dispatcher/team-packsSession or tokenundocumented
POST/api/v2/assignment-rules/dispatcher/team-packsSession or tokenundocumented
GET/api/v2/assignment-rules/project/:projectIdSession or tokenundocumentedNeeds a project the caller can open. Answers with data: rules (entries of person and sentence, fallbackUserId, mode, onCreate, onChange) and ai.state, whether AI is available.
PUT/api/v2/assignment-rules/project/:projectIdSession or tokenundocumentedNeeds the permission to change the project's details. Reads entries (a list of at most 50 objects with userId and when, a sentence of at most 300 characters, one per person), fallbackUserId (id or empty), mode (suggest or apply, suggest when left out), onCreate (boolean, true when left out) and onChange (boolean, false when left out) from the body; each person must hold a seat and be able to open the project. Answers with data: the saved rules.
POST/api/v2/assignment-rules/project/:projectId/draftSession or tokenundocumentedNeeds the permission to change the project's details, and AI must be on with a model configured (409 otherwise). Reads userIds (a list of 1 to 10 ids) from the body. Answers with data.drafts: a suggested rule sentence for each person who can open the project, based on their recent tasks there.
GET/api/v2/assignment-rules/task/:taskIdSession or tokenundocumentedNeeds a task the caller can open (404 otherwise). Answers with data: decision, the latest open suggestion for the task or null, and pending, whether one is still being worked out.
POST/api/v2/assignment-rules/task/:taskId/decisions/:decisionId/acceptSession or tokenundocumentedNeeds the permission to change a task's assignee in the task's project. Assigns the suggested person to the task; 409 when the suggestion was already handled, the task already has an assignee, or the person can no longer open it. Answers with data: the decision.
POST/api/v2/assignment-rules/task/:taskId/decisions/:decisionId/dismissSession or tokenundocumentedNeeds the permission to change a task's assignee in the task's project. Marks the suggestion dismissed. Answers with data: the decision.
POST/api/v2/assignment-rules/task/:taskId/decisions/:decisionId/undoSession or tokenundocumentedNeeds the permission to change a task's assignee in the task's project. Takes back an accepted suggestion. Answers with data: the decision.
POST/api/v2/auth/2fa/disableSession or tokeninternalTurns two-factor sign-in off.
POST/api/v2/auth/2fa/setupSession or tokeninternalStarts two-factor enrolment.
GET/api/v2/auth/2fa/statusSession or tokeninternalWhether two-factor sign-in is on for the signed-in person.
POST/api/v2/auth/2fa/validateNo login guardinternalThe second step of a two-factor sign-in.
POST/api/v2/auth/2fa/verifySession or tokeninternalConfirms a code and turns two-factor sign-in on.
PATCH/api/v2/auth/:id/change-passwordSession or tokeninternalChanges the signed-in person's password.
POST/api/v2/auth/activateNo login guardundocumented
POST/api/v2/auth/activation/verifyNo login guardundocumented
POST/api/v2/auth/forgot-passwordNo login guardinternalStarts a password reset.
POST/api/v2/auth/invitation-acceptSession or tokeninternalAccepts an invitation while signed in.
POST/api/v2/auth/invitation-previewNo login guardinternalShows what an invitation link is for.
POST/api/v2/auth/loginNo login guardinternalSigns in with an email and a password.
POST/api/v2/auth/magic-linkNo login guardinternalEmails a sign-in link.
GET/api/v2/auth/magic-link/verifyNo login guardinternalSigns in from an emailed link.
POST/api/v2/auth/platform-loginNo login guardundocumented
POST/api/v2/auth/reset-passwordNo login guardinternalSets a new password from a reset link.
POST/api/v2/auth/token-verify-forgotpasswordNo login guardinternalChecks a password reset link.
POST/api/v2/auth/tracker-codeSession or tokeninternalIssues a sign-in code for the desktop time tracker.
GET/api/v2/automationsSession or tokenundocumentedLists automations.
POST/api/v2/automationsSession or tokenundocumentedCreates an automation.
PUT/api/v2/automations/:idSession or tokenundocumentedChanges an automation.
DELETE/api/v2/automations/:idSession or tokenundocumentedDeletes an automation.
POST/api/v2/automations/:id/dry-runSession or tokenundocumentedShows what an automation would do on a task, without doing it.
PATCH/api/v2/automations/:id/enabledSession or tokenundocumentedSwitches an automation on or off.
GET/api/v2/automations/:id/runsSession or tokenundocumentedLists an automation's runs.
POST/api/v2/automations/backtestSession or tokenundocumentedShows what a rule would have done on past events.
POST/api/v2/automations/compileSession or tokenundocumentedTurns a sentence or a rule into a checked automation.
POST/api/v2/automations/draftSession or tokenundocumentedDrafts an automation from a sentence.
GET/api/v2/automations/registrySession or tokenundocumentedThe triggers and actions an automation can use.
GET/api/v2/billing/client-viewSession or tokenundocumentedWhat a project's client sees of its billing.
POST/api/v2/billing/client-view/messageSession or tokenundocumentedSends a message from the client view.
GET/api/v2/billing/contractSession or tokenundocumentedReads a project's billing contract.
PUT/api/v2/billing/contractSession or tokenundocumentedChanges a project's billing contract.
GET/api/v2/billing/hourlySession or tokenundocumentedA month's billable hours for a project.
POST/api/v2/billing/milestoneSession or tokenundocumentedAdds a billing milestone.
PATCH/api/v2/billing/milestone/:idSession or tokenundocumentedChanges a billing milestone.
GET/api/v2/calls/ice-configSession or tokeninternalThe connection settings for a call.
GET/api/v2/calls/notesSession or tokenundocumentedLists the caller's own call notes.
POST/api/v2/calls/notesSession or tokenundocumentedSaves the notes of a call.
GET/api/v2/calls/notes/:idSession or tokenundocumentedReads one set of call notes.
PATCH/api/v2/calls/notes/:idSession or tokenundocumentedChanges a set of call notes.
GET/api/v2/changelogNo login guardinternalThe product changelog shown in the web app.
POST/api/v2/checkPermissionNo login guardinternalChecks an invitation link.
POST/api/v2/company/createSession or tokeninternalCreates a workspace.
POST/api/v2/company/deleteSessioninternalDeletes a workspace.
DELETE/api/v2/connectors/google/:connectorSessioninternalEnds the signed-in member's Google connection: revokes the grant with Google and clears the stored tokens.
POST/api/v2/connectors/google/:connector/completeSessioninternalCompletes the connection the same session started: exchanges the code with the PKCE verifier and keeps the tokens in the secrets store.
POST/api/v2/connectors/google/:connector/connectSessioninternalStarts the signed-in member's Google connection and answers Google's consent address. The state is single-use, lasts ten minutes and belongs to this session.
DELETE/api/v2/connectors/google/:connector/members/:userIdSessioninternalFor an owner or admin: ends a member's Google connection.
GET/api/v2/connectors/google/membersSessioninternalFor an owner or admin: which members hold a Google connection, with its scopes, dates and state. Never the account or a token.
GET/api/v2/connectors/google/mineSessioninternalShows the signed-in member's own Google connections: the account's email, the granted scopes, the dates and the state. Never a token or its handle.
GET/api/v2/connectors/slackSessioninternalShows the workspace's Slack connector: whether each secret is set and since when, the channel list and, for each allowed channel, whether agents may read it or post to it. Never a secret.
PUT/api/v2/connectors/slack/channelsSessioninternalSets, for each allowed Slack channel, whether agents may read it, propose a message to it, or both.
POST/api/v2/connectors/slack/channels/refreshSessioninternalReads the Slack channel list again.
PUT/api/v2/connectors/slack/secretsSessioninternalStores the Slack bot token or signing secret in the secrets store, after checking the token with Slack.
DELETE/api/v2/connectors/slack/secrets/:keySessioninternalRemoves a Slack connector secret.
POST/api/v2/createUserNo login guardinternalSigns up.
POST/api/v2/csp-reportNo login guardinternalReceives a browser's content security policy report.
POST/api/v2/custom-fields/:fieldId/ai/applySession or tokenundocumentedAny signed-in member of the workspace who can edit that field on the task. Reads proposalIds (a list of up to 5 ids from a preview the same person made) from the body; an expired one is refused. Answers with data: applied (task ids) and refused (with a reason each).
POST/api/v2/custom-fields/:fieldId/ai/jobsSession or tokenundocumentedAny signed-in member of the workspace who can edit that field on the tasks. Reads taskIds (a list of ids, up to the workspace's bulk limit) and proposalIds (a list of up to 5 ids) from the body. The fill runs in the background. Answers with data: the job.
POST/api/v2/custom-fields/:fieldId/ai/previewSession or tokenundocumentedAny signed-in member of the workspace who can edit that field on the task; a task they cannot edit it on comes back with a reason instead. Reads taskIds (a list of 1 to 5 ids) from the body. Nothing is written. Answers with data.proposals: for each task, a proposalId, the proposed text and fieldValue.
POST/api/v2/custom-fields/:fieldId/deleteSession or tokenundocumentedNeeds the same rights as the usage read; a connected agent is refused. Takes the field and every value of it away for good; archiving (the field update with isDelete) hides a field and keeps its values. A field that a rollup or a formula reads answers 409 with the code FIELD_IS_READ and the same readBy and readElsewhere. Answers with data.tasks: how many tasks the caller could open held a value.
GET/api/v2/custom-fields/:fieldId/usageSession or tokenundocumentedNeeds the permission to edit custom fields in the field's projects, and the field setting for a field of every project. Answers with data: tasks (how many tasks the caller can open hold a value), partial (true when the caller cannot open every task), readBy (the titles of the rollups and formulas that read this field) and readElsewhere (true when a field of a project the caller cannot open reads it). An unknown id answers 404.
GET/api/v2/custom-fields/ai/jobs/:jobIdSession or tokenundocumentedAny signed-in member of the workspace, and only for a job that person started; any other id answers 404 Job not found.. Answers with data: the job and its progress.
POST/api/v2/custom-fields/computeSession or tokenundocumentedNeeds the permission to change a task's custom field. Reads taskIds (a list of 1 to 200 ids) and scope (sprint or left out) from the body; only tasks the caller can open are computed. Answers with data: updated, the computed values and errors.
GET/api/v2/custom-fields/formula/scopeSession or tokenundocumentedAny signed-in member of the workspace may call it. Reads projectId (id) and taskId (id, used only when the caller can open the task) from the query. Answers with data: names a formula may use, with the task's values when a task is named, and the lists of functions and rollupFunctions.
POST/api/v2/custom-fields/formula/validateSession or tokenundocumentedAny signed-in member of the workspace may call it. Reads expression (string, required), fieldId, fieldTitle, projectId (ids and string) and sample (an object of values to try it on) from the body. A formula that does not parse or that closes a cycle answers a failed status with a code. Answers with data: references, functions, preview and previewError.
POST/api/v2/deleteManualLogtimeSession or tokenundocumentedDeletes a manual time entry. Needs a task the caller can open. Reads timeSheetId, logTimeDate, dateFormat, startLogTime, endLogTime, projectId, ticketId, sprintId, taskName and projectName from the body, all required, plus timeDuration (minutes), userId and folderId. Deleting another person's entry needs the Everyone grant on the user timesheet and an open project, else 403. An entry in an approved, locked period is refused. Answers with statusText Logtime deleted successfully. It also writes task history and a notification.
GET/api/v2/epicsSession or tokenundocumentedNeeds a project the caller can open, named by the query field projectId (id). Answers with data: the project's epics, oldest first, with taskCount and completedCount counted over the tasks the caller can open.
POST/api/v2/epicsSession or tokenundocumentedNeeds the permission to create tasks in the project named by projectId. Reads name (string, required), projectId (id, required), description, color, priority, ownerUserId (strings), startDate and dueDate from the body; a failed check answers a failed status with the reason. Answers with data: the new epic.
PUT/api/v2/epics/:idSession or tokenundocumentedNeeds the permission to create tasks in the epic's project. Reads name, color, description, status, priority, ownerUserId, startDate and dueDate from the body and changes the ones sent; a body with none of them answers a failed status. Answers with data: the epic as it is now.
DELETE/api/v2/epics/:idSession or tokenundocumentedNeeds the permission to create tasks in the epic's project. The epic is marked deleted and its tasks are unlinked from it. Answers with statusText Epic deleted. and no data.
POST/api/v2/epics/:id/recountSession or tokenundocumentedNeeds the permission to create tasks in the epic's project. Counts the epic's tasks again and answers with data: the epic with taskCount and completedCount, counted for tasks the caller can open.
POST/api/v2/epics/assignSession or tokenundocumentedNeeds the permission to create tasks in the projects of both the task and the epic. Reads taskId (id) and epicId (id, or empty or null to take the task out) from the body; a task the caller cannot open, or an epic that does not exist, answers a failed status. Answers with data: taskId and epicId.
GET/api/v2/exportsSession or tokenundocumentedAny signed-in member of the workspace may call it, and it lists only the caller's own exports (a uid of someone else answers 403). Answers with data: up to 20 exports, newest first, each with type, format, status, fileName, total, processed, error and createdAt.
POST/api/v2/exportsSession or tokenundocumentedAny signed-in member of the workspace who can list the project's tasks (404 otherwise). Reads format (csv or xlsx), projectId (id), sprintId (id, optional) and projectName (string) from the body. The export runs in the background. Answers with data: the job.
GET/api/v2/exports/:id/downloadSession or tokenundocumentedAny signed-in member of the workspace may call it, for an export the caller started; a workspace export also needs the owner or admin role. Answers with the file once the export has finished, and 404 Export not ready. before that.
POST/api/v2/exports/workspaceSession or tokenundocumentedOwners and admins only. Reads format (csv or xlsx, xlsx when left out) from the body. The export runs in the background. Answers with data: the job's _id, type, format, status, fileName and createdAt.
GET/api/v2/formsSession or tokenundocumentedNeeds a project the caller can open, named by the query field projectId (id); otherwise 404. Answers with data: the project's forms, newest first, each with title, description, sprintId, state and submissionCount.
POST/api/v2/formsSession or tokenundocumentedNeeds edit rights on the project named in the body (403 without them, 404 when it cannot be seen). Reads title (string, required), projectId (id, required), description (string) and sprintId (id) from the body. The form starts as a draft with no questions. Answers with data: the form.
GET/api/v2/forms/:idSession or tokenundocumentedNeeds a project the caller can open; otherwise 404 Form not found.. Answers with data: the form with its questions, and its public url while it is live.
PUT/api/v2/forms/:idSession or tokenundocumentedNeeds edit rights on the form's project. Reads title, description, successMessage (strings), sprintId (id), questions (list), defaults (object) and state from the body and changes the ones sent; a failed check answers a failed status with the reason. Answers with data: the form as it is now.
DELETE/api/v2/forms/:idSession or tokenundocumentedNeeds edit rights on the form's project. A form that is published answers a failed status, and must be taken offline first. The form is marked deleted and the tasks it filed are kept. Answers with statusText Form deleted. and no data.
POST/api/v2/forms/:id/publishSession or tokenundocumentedNeeds edit rights on the form's project (403 without them, 404 when the project cannot be seen). Reads publish (boolean, true when left out; false takes the form offline) from the body. A form that fails the checks for going live answers a failed status with the reason. Answers with data: state and, when live, token and url.
GET/api/v2/forms/:id/submissionsSession or tokenundocumentedNeeds edit rights on the form's project, because submissions hold the submitters' answers. Reads q (string, up to 120 characters, matched against every answer), page and limit (numbers, 10 per page by default and at most 100) and all (1 returns up to 5000 rows for an export) from the query. Answers with data: submissions, total, page, pages and truncated.
GET/api/v2/forms/fieldsSession or tokenundocumentedAny signed-in member of the workspace may call it. Answers with data: the questions a form can ask, as groups, the widgets, spans, gridColumns and the task fields a question can be mapped to.
POST/api/v2/generateTokenNo login guardinternalExchanges a refresh token for a new access token.
POST/api/v2/github-signupNo login guardinternalSigns in or up with GitHub.
POST/api/v2/gitlab-signupNo login guardinternalSigns in or up with GitLab.
USE/api/v2/goalsSession or tokeninternalRuns before every goal route: reads pass through, and a write (POST, PATCH, PUT or DELETE) made with an agent's token is judged by the rules that hold that agent.
POST/api/v2/google-signupNo login guardinternalSigns in or up with Google.
GET/api/v2/importsSession or tokenundocumentedLists imports.
POST/api/v2/imports/asanaSession or tokenundocumentedImports from Asana.
POST/api/v2/imports/clickupSession or tokenundocumentedImports from ClickUp.
POST/api/v2/imports/clickup/previewSession or tokenundocumentedPreviews a ClickUp import.
POST/api/v2/imports/clickup/projectSession or tokenundocumentedImports a ClickUp export as a new project.
POST/api/v2/imports/csvSession or tokenundocumentedImports tasks from a CSV file.
POST/api/v2/imports/csv/previewSession or tokenundocumentedPreviews a CSV import.
POST/api/v2/imports/jiraSession or tokenundocumentedImports from Jira.
POST/api/v2/imports/mondaySession or tokenundocumentedImports from Monday.
POST/api/v2/imports/trelloSession or tokenundocumentedImports from Trello.
GET/api/v2/instance/accessInstance admininternalInstance administration.
GET/api/v2/instance/ai/providersInstance admininternalInstance administration.
GET/api/v2/instance/audit-exportInstance admininternalInstance administration.
POST/api/v2/instance/audit/:companyId/redact-personInstance admininternalInstance administration.
GET/api/v2/instance/backupsInstance admininternalInstance administration.
POST/api/v2/instance/backupsInstance admininternalInstance administration.
DELETE/api/v2/instance/backups/:nameInstance admininternalInstance administration.
GET/api/v2/instance/backups/:name/downloadInstance admininternalInstance administration.
GET/api/v2/instance/backups/:name/manifestInstance admininternalInstance administration.
POST/api/v2/instance/backups/:name/restoreInstance admininternalInstance administration.
GET/api/v2/instance/companiesInstance admininternalInstance administration.
GET/api/v2/instance/cspInstance admininternalInstance administration.
GET/api/v2/instance/egressInstance admininternalInstance administration.
PUT/api/v2/instance/egress/:companyIdInstance admininternalInstance administration.
GET/api/v2/instance/enforcementInstance admininternalInstance administration.
GET/api/v2/instance/enforcement/:companyId/decisionsInstance admininternalInstance administration.
PUT/api/v2/instance/enforcement/:companyId/modeInstance admininternalInstance administration.
PUT/api/v2/instance/enforcement/defaultInstance admininternalInstance administration.
GET/api/v2/instance/healthInstance admininternalInstance administration.
GET/api/v2/instance/instruction-patternsInstance admininternalInstance administration.
POST/api/v2/instance/instruction-patternsInstance admininternalInstance administration.
DELETE/api/v2/instance/instruction-patterns/:idInstance admininternalInstance administration.
GET/api/v2/instance/knowledgeInstance admininternalInstance administration.
GET/api/v2/instance/knowledge/:companyIdInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/erase/documentInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/erase/personInstance admininternalInstance administration.
GET/api/v2/instance/knowledge/:companyId/exclusionsInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/exclusions/:exclusionId/removeInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/reembedInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/reindexInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/reindex/cancelInstance admininternalInstance administration.
POST/api/v2/instance/knowledge/:companyId/retry-filesInstance admininternalInstance administration.
GET/api/v2/instance/logsInstance admininternalInstance administration.
GET/api/v2/instance/logs/downloadInstance admininternalInstance administration.
GET/api/v2/instance/logs/filesInstance admininternalInstance administration.
POST/api/v2/instance/maintenanceInstance admininternalInstance administration.
GET/api/v2/instance/metricsInstance admininternalInstance administration.
POST/api/v2/instance/migrations/runInstance admininternalInstance administration.
GET/api/v2/instance/orphan-databasesInstance admininternalInstance administration.
POST/api/v2/instance/orphan-databases/:name/dropInstance admininternalInstance administration.
GET/api/v2/instance/public-configNo login guardinternalWhat the sign-in page needs to know about the instance.
POST/api/v2/instance/restartInstance adminundocumented
GET/api/v2/instance/settingsInstance admininternalInstance administration.
PUT/api/v2/instance/settingsInstance admininternalInstance administration.
POST/api/v2/instance/settings/testInstance admininternalInstance administration.
GET/api/v2/instance/statsInstance admininternalInstance administration.
GET/api/v2/instance/support-accessInstance adminundocumented
GET/api/v2/instance/upgradeInstance admininternalInstance administration.
GET/api/v2/intakeSession or tokenundocumentedLists submissions waiting for review.
POST/api/v2/intake/reviewSession or tokenundocumentedAccepts or rejects a submission.
GET/api/v2/invoicesSession or tokenundocumentedLists a project's invoices.
GET/api/v2/invoices/:idSession or tokenundocumentedReads an invoice.
PUT/api/v2/invoices/:idSession or tokenundocumentedChanges a draft invoice.
DELETE/api/v2/invoices/:idSession or tokenundocumentedDeletes a draft invoice.
POST/api/v2/invoices/:id/paidSession or tokenundocumentedMarks an invoice as paid.
POST/api/v2/invoices/:id/sendSession or tokenundocumentedIssues an invoice.
POST/api/v2/invoices/draft-from-milestoneSession or tokenundocumentedDrafts an invoice from a milestone.
POST/api/v2/invoices/draft-from-monthSession or tokenundocumentedDrafts an invoice from a month of logged time.
POST/api/v2/logoutSession or tokeninternalSigns out.
POST/api/v2/manualLogtimeSession or tokenundocumentedAdds a manual time entry to a task, or edits one. Needs a task the caller can open. Reads logTimeDate, description, startLogTime, endLogTime, timeDuration (a string like HH:MM), ticketId, projectId, isEdit (a boolean), dateFormat, taskName, projectName, sprintId and timeZone from the body, all required, plus timeSheetId and previousLoggedTime when isEdit is true. Optional: userId, billable, folderId, companyOwnerId. Logging for another person needs the Everyone grant on the user timesheet and the project must be open to the caller, else 403. The person must be a member (400). An entry in an approved, locked period is refused. Answers with statusText Logtime added successfully and data: the saved entry. It also writes task history and a notification.
GET/api/v2/oauth-client-approvalsSessioninternalLists OAuth clients waiting for approval.
POST/api/v2/oauth-client-approvals/approveSessioninternalApproves an OAuth client.
POST/api/v2/oauth-client-approvals/denySessioninternalDenies an OAuth client.
POST/api/v2/oauth-client-approvals/revokeSessioninternalRevokes an approval.
GET/api/v2/oauth-clientsSessioninternalLists the workspace's OAuth clients.
POST/api/v2/oauth-clientsSessioninternalRegisters an OAuth client.
DELETE/api/v2/oauth-clients/:clientIdSessioninternalRevokes an OAuth client.
GET/api/v2/oauth-grantsSessioninternalLists the caller's own OAuth grants.
DELETE/api/v2/oauth-grants/:grantIdSessioninternalRevokes one of the caller's OAuth grants.
POST/api/v2/oauth-grants/:grantId/withdrawSessioninternalWithdraws some of the permissions the caller gave a connected app.
PUT/api/v2/pages/:id/approveSession or tokenundocumentedNeeds edit rights on the page, and a share by name as editor is not enough; a person must make the call. Only a page an agent drafted can be approved, else a failed status. Answers with data: the page.
GET/api/v2/pages/:id/commentsSession or tokenundocumentedAny signed-in member who may read the page. Answers with data: the page's comments, oldest first, up to 500, with limit and atLimit.
POST/api/v2/pages/:id/commentsSession or tokenundocumentedAny signed-in member who may read the page. Reads message (string), blockId (string), parentId (id of a comment to reply under) and an attached file as mediaURL, mediaOriginalName and mediaSize from the body. A page holds at most 500 comments (409). Answers with data: the comment.
PUT/api/v2/pages/:id/comments/:commentIdSession or tokenundocumentedOnly the comment's author, who must be able to read the page (403 for anyone else). Reads message (string) from the body. Answers with data: the comment as it is now.
DELETE/api/v2/pages/:id/comments/:commentIdSession or tokenundocumentedThe comment's author or an admin, who must be able to read the page. A thread is deleted with its replies. Answers with data._id: the id of the comment.
PUT/api/v2/pages/:id/comments/:commentId/resolveSession or tokenundocumentedAny signed-in member who may read the page; a thread that has an assignee can be resolved only by the assignee, the person who assigned it or an admin, and a reply cannot be resolved (400). Reads resolved (boolean, true when left out; false reopens the thread) from the body. Answers with data: the comment.
POST/api/v2/pages/:id/imagesSession or tokenundocumentedNeeds edit rights on the page. Takes a multipart body with the image as file. Answers with data.key: the key to put in the page's image block.
PUT/api/v2/pages/:id/reviewSession or tokenundocumentedNeeds edit rights on the page, and a share by name as editor is not enough. Reads nextReviewDate (a date, three months ahead when left out) from the body, marks the page as a wiki page reviewed now by the caller, and answers with data: the page.
GET/api/v2/pages/:id/sharesSession or tokenundocumentedOnly the page's author, or an owner or admin who can open it (403 for anyone else). Answers with data: people, each with userId, role, by, at and active, and limit.
PUT/api/v2/pages/:id/shares/:userIdSession or tokenundocumentedOnly the page's author, or an owner or admin who can open it. Reads role (viewer or editor, viewer when left out) from the body; the person must be an active member of the workspace, and a page can be shared with a limited number of people (400 otherwise). Answers with data: the list of people the page is shared with.
DELETE/api/v2/pages/:id/shares/:userIdSession or tokenundocumentedOnly the page's author, or an owner or admin who can open it. Answers with data: the list of people the page is still shared with.
POST/api/v2/pages/aiSession or tokenundocumentedAny signed-in member of the workspace may call it. Reads action, title, instruction and currentText (strings) and pageId (id of a page the caller may read, whose title and text fill in what is left out) from the body. Answers with data: the composed text, or a failed status with the reason, and isNotAi when no AI is set up.
GET/api/v2/pages/ai-statusSession or tokenundocumentedAny signed-in member of the workspace may call it. Answers with data.configured: whether an AI provider is set up for writing pages.
GET/api/v2/plan/usageSession or tokenundocumented
GET/api/v2/plan/workspacesSession or tokenundocumented
PUT/api/v2/platform/configPlatform keyundocumented
PUT/api/v2/platform/entitlementsPlatform keyundocumented
POST/api/v2/platform/lifecyclePlatform keyundocumented
POST/api/v2/platform/owner/activation-linkPlatform keyundocumented
POST/api/v2/platform/owner/login-linkPlatform keyundocumented
POST/api/v2/platform/owner/transferPlatform keyundocumented
POST/api/v2/platform/provisionPlatform keyundocumented
POST/api/v2/platform/rotate-keyPlatform keyundocumented
GET/api/v2/platform/statusPlatform keyundocumented
POST/api/v2/platform/support-sessionPlatform keyundocumented
DELETE/api/v2/platform/support-sessionPlatform keyundocumented
GET/api/v2/platform/usagePlatform keyundocumented
POST/api/v2/prepare-notification-dataSession or tokeninternalPrepares notification data for the web app.
GET/api/v2/provider-keysSessioninternalLists the workspace's AI provider keys, by handle only.
PUT/api/v2/provider-keys/:providerSessioninternalStores a workspace AI provider key.
DELETE/api/v2/provider-keys/:providerSessioninternalRemoves a workspace AI provider key.
GET/api/v2/public-sharesSession or tokenundocumentedLists the public links of something.
POST/api/v2/public-sharesSession or tokenundocumentedCreates a public link to a list, a report or a page.
PUT/api/v2/public-shares/:idSession or tokenundocumentedSwitches a public link on or off.
DELETE/api/v2/public-shares/:idSession or tokenundocumentedRevokes a public link.
POST/api/v2/reactionsSession or tokenundocumentedAny signed-in member of the workspace who can read the target. Reads targetType (task or comment), targetId (id), emoji (string) and isProjectComment (boolean) from the body; the caller's own reaction is added, or removed if it is already there. A target the caller cannot read answers 404. Answers with data.reactions: the target's reactions.
GET/api/v2/recent-visitsSession or tokeninternalAny signed-in member of the workspace may call it, and it lists that person's own visits. Reads types (a comma list of task, project, sprint and doc, or all; tasks only when left out) and limit (a number) from the query. Visits to anything deleted or no longer open to the caller drop out. Answers with data: the newest visits first.
POST/api/v2/recent-visitsSession or tokeninternalAny signed-in member of the workspace may call it, and it records a visit for that person only. Reads entityType (task, project, sprint or doc) and entityId (id) from the body. Answers with statusText Visit recorded. and no data.
DELETE/api/v2/sample-dataSession or tokeninternalRemoves the sample data a new workspace starts with.
GET/api/v2/scim/configSession or tokeninternalReads the workspace's SCIM settings.
PUT/api/v2/scim/configSession or tokeninternalChanges the workspace's SCIM settings.
POST/api/v2/scim/tokenSession or tokeninternalIssues a new SCIM token for the workspace.
POST/api/v2/searchSession or tokenundocumentedAny signed-in member of the workspace may call it. Reads query (string) from the body and matches it against task names and keys, project names, comment text and page titles, within the projects, lists and pages the caller can open. Answers with data: tasks, projects, comments and pages, each limited in number.
GET/api/v2/secretsSessioninternalLists the workspace's secrets, by handle only.
POST/api/v2/secretsSessioninternalStores a workspace secret.
POST/api/v2/secrets/:handle/revokeSessioninternalRevokes a workspace secret.
POST/api/v2/secrets/:handle/rotateSessioninternalReplaces a workspace secret.
POST/api/v2/sendForgotPasswordEmailNo login guardinternalEmails a password reset link.
POST/api/v2/sendInvitationEmailSession or tokeninternalInvites people to the workspace.
POST/api/v2/sendVerificationEmailNo login guardinternalEmails a verification link.
DELETE/api/v2/session/deleteSession or tokeninternalEnds the person's sessions.
DELETE/api/v2/session/delete/:idSession or tokeninternalEnds one session.
PUT/api/v2/session/updateSession or tokeninternalUpdates the current session's record.
POST/api/v2/setup/completeNo login guardinternalFinishes the first-run setup.
GET/api/v2/setup/events/:idNo login guardinternalThe progress stream of the first-run setup.
GET/api/v2/setup/statusNo login guardinternalWhether the instance has been set up.
POST/api/v2/sprints/backlogSession or tokenundocumentedNeeds a project the caller can open. Reads projectId (id) from the body. Answers with data: the project's backlog list, which is made first if it does not exist.
POST/api/v2/sprints/burndownSession or tokenundocumentedNeeds a project the caller can open and a list the caller can see. Reads sprintId (id) from the body. Answers with data: the sprint's name, state, goal and dates, its totals of tasks, estimate and points, and a days series with the ideal line.
POST/api/v2/sprints/completeSession or tokenundocumentedNeeds write access to the list's project and the permission to create lists there; a person must make the call. Reads sprintId (id) and incompleteDestination (next, backlog or the id of an open sprint of the same project, next when left out) from the body. Unfinished tasks move to the destination. Answers with data: the completed sprint; a sprint already completed answers success and moves nothing.
GET/api/v2/sprints/complete-previewSession or tokenundocumentedNeeds a project the caller can open and a list the caller can see. Reads sprintId (id) from the query; a list that is not a sprint answers a failed status. Answers with data: the sprint's state, commitment, tasks added after the start, and the counts of finished work and of unfinished work with a list of it.
POST/api/v2/sprints/hoursSession or tokenundocumentedNeeds a project the caller can open and a list the caller can see. Reads sprintId (id) from the body. Answers with data: plannedMinutes, loggedMinutes and overdueMinutes, the minutes the sprint is projected to run over its plan.
GET/api/v2/sprints/reportSession or tokenundocumentedNeeds a project the caller can open and a list the caller can see. Reads sprintId (id) from the query; a list that is not a sprint answers a failed status. Answers with data: the sprint's state, goal and dates, and the totals of what was committed, completed and left unfinished, with the tasks added after the start and those moved out.
POST/api/v2/sprints/scrumSession or tokenundocumentedNeeds write access to the list's project and the permission to create lists there; a person must make the call. Reads sprintId (id), isScrum (boolean; false turns Scrum off), goal (string), startDate and endDate (dates, both or neither, the end after the start) from the body. A completed sprint cannot be edited, and a running one cannot have Scrum turned off. Answers with data: the sprint.
POST/api/v2/sprints/startSession or tokenundocumentedNeeds write access to the list's project and the permission to create lists there; a person must make the call. Reads sprintId (id) from the body. The list must be a sprint with a start and end date, and a project runs one sprint at a time; the tasks in it become the sprint's commitment. Answers with data: the started sprint, or a failed status with the reason.
GET/api/v2/sso/configSession or tokeninternalReads the workspace's single sign-on settings.
PUT/api/v2/sso/configSession or tokeninternalChanges the workspace's single sign-on settings.
POST/api/v2/sso/config/verify-domainSession or tokeninternalChecks the DNS record of a single sign-on domain.
GET/api/v2/sso/discoverNo login guardinternalFinds the single sign-on workspace for an email's domain.
GET/api/v2/sso/oidc/callbackNo login guardinternalFinishes an OpenID Connect sign-in.
GET/api/v2/sso/oidc/initiateNo login guardinternalStarts an OpenID Connect sign-in.
GET/api/v2/sso/publicNo login guardinternalWhat the sign-in page needs to offer single sign-on.
POST/api/v2/sso/saml/acsNo login guardinternalReceives the SAML assertion.
GET/api/v2/sso/saml/initiateNo login guardinternalStarts a SAML sign-in.
GET/api/v2/sso/saml/metadataNo login guardinternalThe SAML service provider metadata.
POST/api/v2/support-mailSession or tokeninternalSends a message to support from the web app.
GET/api/v2/task-templatesSession or tokenundocumentedAny signed-in member of the workspace may call it. Reads projectId (id, optional) from the query: with it, the workspace's templates and that project's, for a project the caller can open; without it, the workspace's templates and those of every project the caller can open. Answers with data, sorted by name, each with name, scope, projectId, isDefault, canManage and a count of what it carries.
POST/api/v2/task-templatesSession or tokenundocumentedAllowed for owners and admins when scope is workspace, and otherwise for those who can create tasks in the task's project. Reads name (string, required), scope (project or workspace, project when left out), taskId (id of the task to copy from, required) and include (an object of booleans, where false leaves a part out) from the body. Answers with data: the template.
PATCH/api/v2/task-templates/:idSession or tokenundocumentedAllowed for owners and admins on a workspace template, and for those who can create tasks in the project on a project template. Reads name (string, required) from the body. Answers with statusText Template renamed. and no data.
DELETE/api/v2/task-templates/:idSession or tokenundocumentedAllowed for owners and admins on a workspace template, and for those who can create tasks in the project on a project template. The template is marked deleted and is no longer any project's default. Answers with statusText Template deleted. and no data.
POST/api/v2/task-templates/:id/applySession or tokenundocumentedNeeds the permission to create tasks in the task's project; fields the caller's role may not change are skipped and named. Reads taskId (id, required), overwrite and preview (booleans) from the body; with preview true nothing is written. Answers with data: applied, conflicts, skipped, checklistAdded and subtasksCreated.
PUT/api/v2/task-templates/defaultSession or tokenundocumentedNeeds the permission to change the project's details. Reads projectId (id, required) and templateId (id, or empty to clear the default) from the body; the template must be a workspace one or that project's. Answers with statusText saying whether a default was set or cleared.
POST/api/v2/tasks/bulkSession or tokenundocumentedRuns one change on many tasks at once. The caller must be able to open every task in taskIds and hold the permission for the chosen action in their projects, for example task.task_status for bulkUpdateStatus, task.task_delete for bulkDelete, task.task_archive for bulkArchive, task.task_move for bulkMove. Reads action (string, must start with bulk and be a known bulk action such as bulkUpdateStatus, bulkUpdatePriority, bulkUpdateDueDate, bulkUpdateStartDate, bulkUpdateDates, bulkUpdateAssignee, bulkUpdateTags, bulkArchive, bulkRestore, bulkDelete, bulkTrash, bulkMove, bulkConvertToSubTask, bulkConvertToTask, bulkAddToList, bulkDuplicate) and taskIds (list of ids) from the body, plus the fields that action takes, such as newStatus, firebaseObj, DueDate, startDate, employeeId, tagId, sprintObj, projectData, parentTaskId. Answers with data: updated, skipped (task id and reason), errors, totals (counts of each), and statusText 'Bulk operation completed'. A bad or unknown action answers status false with 'Invalid bulk action' or 'Unknown bulk action'. A task or destination the caller cannot open answers 404, a missing permission answers 403.
POST/api/v2/tasks/relationsSession or tokenundocumentedLinks two tasks, unlinks them, or lists a task's links. The caller must be able to open the task, with the task.task_list permission in its project. Reads action (string: add, remove, list or openBlockers) and companyId from the body, then taskId (id, required), and for add and remove also relatedTaskId (id); for add it also reads type (one of blocks, blocked_by, duplicates, duplicated_by, relates_to). Answers with the handler's own envelope: status, statusText and data. For add and remove, data holds taskId, relatedTaskId and relations (only the links the caller can open). For list, data is the linked tasks, each with taskId, type, label, createdBy, createdAt and a short task summary. For openBlockers, data is the blocked_by links whose blocking task is still open. Failures such as a missing task or two tasks already linked answer status false with the error text as statusText. An unknown action answers status false with 'Invalid relation action'.
POST/api/v2/testSession or tokeninternalUsed by the web app.
POST/api/v2/timeTracker/startSession or tokeninternalStarts a tracker timer on a task. Any signed-in member of the workspace may call it. The caller can only start a timer for themselves; a userId naming someone else answers 403. Reads description, projectId and taskId from the body, all required. A start in an approved, locked period is refused. Answers with statusText: the id of the new time entry.
POST/api/v2/timesheet-approval/:id/reviewSession or tokenundocumentedApproves, rejects or reopens a submitted timesheet period. Only an owner or admin may call it; others get status false. Reads id (the approval record id) from the path and action (approve, reject or reopen) and reason (string, needed to reject) from the body. The record must be in a state that allows the action. An owner or admin may approve their own week, and the record is marked as self approved. Answers with statusText like Timesheet approved. and data: the updated record.
POST/api/v2/timesheet-approval/bulk-reviewSession or tokenundocumentedApproves or rejects several submitted timesheet periods at once. Only an owner or admin has any effect; for others every id is skipped as not_allowed. Reads ids (a list of record ids, 1 to 100) and action (approve or reject) from the body, both required, plus reason (required to reject). Bad input answers 400. Answers with data: results (one id and outcome each, skipped ones with a reason) and counts (approved, sent_back, skipped).
GET/api/v2/timesheet-approval/mineSession or tokenundocumentedLists a person's timesheet submissions, newest period first. Any signed-in member of the workspace may call it. Reads userId from the query. Only an owner or admin may read another person's list; for anyone else userId is ignored and their own is read. Answers with data: the approval records.
GET/api/v2/timesheet-approval/pendingSession or tokenundocumentedLists submitted timesheet periods that wait for review. Only an owner or admin may call it; others get status false with statusText Only an owner or admin can review timesheets. Reads nothing. Answers with data: the submitted records, oldest first.
GET/api/v2/timesheet-approval/queueSession or tokenundocumentedLists submitted timesheet periods with the context a reviewer needs. Only an owner or admin may call it; others get status false. Reads hoursPerDay (a number, default 8) from the query. Answers with data: the submitted records, oldest first, each with userName, userAvatar, totalMinutes, entryCount, billableMinutes, nonBillableMinutes, capacityMinutes and overMinutes.
GET/api/v2/timesheet-approval/statusSession or tokenundocumentedReads the approval record of one timesheet period. Any signed-in member of the workspace may call it. Reads periodStart and periodEnd (dates, required) and userId from the query. Only an owner or admin may read another person's record; for anyone else userId is ignored and their own is read. Answers with data: the approval record, or null when none exists.
POST/api/v2/timesheet-approval/submitSession or tokenundocumentedSends a timesheet period in for approval. Any signed-in member of the workspace may call it. A member submits their own sheet; an owner or admin may pass another member's userId, otherwise it is refused. Reads periodStart and periodEnd (dates, required), periodType (string, default week), note (string) and userId from the body. A period that is already approved is refused. It saves the period as submitted with the minutes and entry count logged in it. Answers with statusText Timesheet submitted for approval. and data: the approval record.
GET/api/v2/timetracker/can-startSession or tokeninternalTells whether the caller may start a timer now. Any signed-in member of the workspace may call it. Reads nothing. Answers with statusText OK when it may, or status false with code period_locked when today falls in an approved, locked timesheet period.
POST/api/v2/timetracker/captureSession or tokeninternalStores a tracker screenshot on a running timer and moves its end time forward. Any signed-in member of the workspace may call it. Reads file, path, companyId, timeSheetId, key, imageName, prevscreenShot, screenShotTime, memoName and strokes (a JSON string) from a form upload; all are required. companyId must match the company header, timeSheetId must be a timer of the caller that is still running, and path must lie in that timer's own capture folder, or it answers 403 (a path already stored answers 409). The image is read from file as a base64 string. Answers with statusText Data Update Succesfully.
POST/api/v2/timetracker/endSession or tokeninternalStops a tracker timer and saves the time. Any signed-in member of the workspace may call it. The timer must belong to the caller (403 otherwise, 404 if not found). Reads timeSheetId, sprintId, projectId, taskId, taskName, projectName, companyOwnerId, dateFormat, timeZone and strokes from the body, all required, plus considerActionTime and actionTime. A timer that began in an approved, locked period is refused. Answers with statusText Logtime added successfully. It also writes task history and a notification.
GET/api/v2/timetracker/runningSession or tokeninternalLists the caller's open tracker timers. Any signed-in member of the workspace may call it. Reads timeZone (a zone name) from the query. Answers with data: up to 20 timers, newest first, each with timeSheetId, taskId, taskName, sprintId, projectId, projectName, projectColor, note, startedAt, recordedMinutes, elapsedSec, live, overnight and suggestedMinutes.
POST/api/v2/timetracker/timelogSession or tokeninternalLists the caller's own time entries created in a date range. Any signed-in member of the workspace may call it. Only the caller's own entries are returned; a userId naming someone else answers 403. Reads startDate and endDate (dates, default today) and type (the collection name, default the time entries) from the body. Answers with data: the matching entries.
POST/api/v2/timetracker/trimSession or tokeninternalCloses an open timer at a set length. Any signed-in member of the workspace may call it. The timer must be the caller's own unless the caller is an owner or admin. Reads timeSheetId (id) and minutes (a whole number from 1 to 1440) from the body, both required. A timer in an approved, locked period is refused. Answers with statusText Timer trimmed. and data: the updated entry. Failures come back with status false and a statusText.
GET/api/v2/tracker/desktop-appSession or tokeninternalThe desktop tracker card on Settings > Time tracking. Any signed-in member of the workspace may call it. Reads nothing. Answers with data: enabled (the plan has the time tracker), seats (used and limit, empty for no limit), release (the newest stable tracker from the update feed with one download per system, or empty), screenshots (bytes stored, empty until the nightly count runs, and retention with enabled and maxAgeMonths), managed and portalUrl.
GET/api/v2/tracker/handshakeNo login guardundocumentedWhat the desktop tracker reads before anyone signs in. Public. Answers with data: app (always alianhub), version (the server's), name and logoUrl (the ones the sign-in page shows), tracker with enabled (whether any workspace here has the time tracker in its plan) and minVersion (the oldest tracker this server accepts), and managed (whether AlianHub hosts this instance).
GET/api/v2/trashSession or tokenundocumentedAny signed-in member of the workspace may call it. Reads kind (projects, folders, lists, tasks or docs, projects when left out) from the query. Lists only what the caller could open. Answers with data: the trashed items, each with a title, a code and a projectId.
PUT/api/v2/trash/:kind/:id/restoreSession or tokenundocumentedNeeds what deleting that kind needed, in the project the item belongs to; a person must make the call; a doc is judged by the doc rules. The path kind is projects, folders, lists, tasks or docs, and id an id. Projects and lists come back together with their tasks. Answers with data: the kind and id.
GET/api/v2/users/favouritesSession or tokeninternalReads the person's favourites.
PUT/api/v2/users/favouritesSession or tokeninternalAdds or removes a favourite.
PUT/api/v2/users/favourites/orderSession or tokeninternalReorders the person's favourites.
PUT/api/v2/users/home-cardsSession or tokeninternalStores the person's home page cards.
PUT/api/v2/users/nav-preferencesSession or tokeninternalStores the person's navigation preferences.
PUT/api/v2/users/onboardingSession or tokeninternalStores the person's onboarding progress.
GET/api/v2/users/sessionsSession or tokeninternalLists the person's sessions.
DELETE/api/v2/users/sessions/:sessionIdSession or tokeninternalEnds one of the person's sessions.
POST/api/v2/verifyEmailNo login guardinternalVerifies an email address from a link.
GET/api/v2/view-templatesSession or tokenundocumentedAny signed-in member of the workspace may call it. Answers with data, sorted by name, each template with name, viewType and canManage, which is true for owners and admins.
POST/api/v2/view-templatesSession or tokenundocumentedNeeds the permission to change the project's views. Reads projectId (id), viewId (string) and name (string) from the body, and keeps the setup of that view as a template; a workspace holds a limited number. Answers with data: the template.
PATCH/api/v2/view-templates/:idSession or tokenundocumentedOwners and admins only. Reads name (string, required) from the body. Answers with data: the renamed template.
DELETE/api/v2/view-templates/:idSession or tokenundocumentedOwners and admins only. The template is marked deleted. Answers with statusText Template deleted. and no data.
GET/api/v2/who-can-see/:kind/:idSession or tokenundocumentedWho can see a project, a list or a page.
GET/api/v2/workflows/approvalsSession or tokenundocumentedLists workflow steps waiting for a decision.
GET/api/v2/workflows/definitionsSession or tokenundocumentedLists workflow definitions.
POST/api/v2/workflows/definitionsSession or tokenundocumentedCreates a workflow definition.
PUT/api/v2/workflows/definitions/:idSession or tokenundocumentedChanges a workflow definition.
DELETE/api/v2/workflows/definitions/:idSession or tokenundocumentedDeletes a workflow definition.
PATCH/api/v2/workflows/definitions/:id/enabledSession or tokenundocumentedSwitches a workflow definition on or off.
POST/api/v2/workflows/dry-runSession or tokenundocumentedShows what a workflow would do, without doing it.
GET/api/v2/workflows/runsSession or tokenundocumentedLists workflow runs.
POST/api/v2/workflows/runsSession or tokenundocumentedStarts a workflow run.
GET/api/v2/workflows/runs/:idSession or tokenundocumentedReads a workflow run and its steps.
POST/api/v2/workflows/runs/:id/steps/:stepId/compensateSession or tokenundocumentedUndoes a step.
POST/api/v2/workflows/runs/:id/steps/:stepId/decideSession or tokenundocumentedApproves or rejects a step.
POST/api/v2/workflows/runs/:id/steps/:stepId/reassignSession or tokenundocumentedHands a step's decision to someone else.
POST/api/v2/workflows/runs/:id/steps/:stepId/resumeSession or tokenundocumentedResumes a step.
POST/api/v2/workflows/runs/:id/steps/:stepId/retrySession or tokenundocumentedRetries a step.
POST/api/v2/workflows/runs/:id/steps/:stepId/skipSession or tokenundocumentedSkips a step.
GET/api/v2/workflows/step-typesSession or tokenundocumentedThe step types a workflow can use.
GET/api/v2/workflows/templatesSession or tokenundocumented
POST/api/v2/workflows/templates/:key/installSession or tokenundocumented

Version 1 (the web app's own API) ​

MethodPathAuthStatusSummary
GET/api/v1/activity-logSession or tokeninternal
POST/api/v1/addmilestoneSession or tokeninternal
POST/api/v1/admin/checkSendInviatationSession or tokeninternal
POST/api/v1/admin/companySession or tokeninternal
PUT/api/v1/admin/companySession or tokeninternal
POST/api/v1/admin/company/findSession or tokeninternal
GET/api/v1/admin/plan-featureSession or tokeninternal
GET/api/v1/admin/plan-feature-displaySession or tokeninternal
POST/api/v1/admin/wasabi/retriveObjectSession or tokeninternal
GET/api/v1/advance/filter/:userId/:filterTypeSession or tokeninternal
POST/api/v1/advance/filter/createSession or tokeninternal
DELETE/api/v1/advance/filter/delete/:cid/:idSession or tokeninternal
POST/api/v1/advance/filter/search/commentsSession or tokeninternal
POST/api/v1/advance/filter/search/filesSession or tokeninternal
POST/api/v1/advance/filter/search/linksSession or tokeninternal
POST/api/v1/advance/filter/search/projectsSession or tokeninternal
POST/api/v1/advance/filter/search/tasksSession or tokeninternal
PUT/api/v1/advance/filter/updateSession or tokeninternal
GET/api/v1/agile/burndownSession or tokeninternalGives the burndown of one list (sprint): how much work is left each day against an ideal line. The caller must be able to open the sprint's project and the sprint itself (a private sprint is only for its people and the admins). Reads sprintId (id, required) from the query. Answers with data: sprintName, isScrum, state, goal, startDate, endDate, totalCount, totalEstimate, totalPoints and days (each with date, remainingCount, remainingEstimate, remainingPoints, ideal, idealPoints), and statusText 'Burndown computed.'. A list with no tasks answers data with an empty days. A bad id answers status false with 'companyId and a valid sprintId are required.', a missing sprint answers status false with 'Sprint not found.'.
GET/api/v1/agile/cfdSession or tokeninternalGives the cumulative flow of a project: how many tasks sit in each status group on each day. The caller must be able to open the project, and tasks in private sprints they cannot see are left out. Reads projectId (id, required), from and to (dates, optional, default is the last 30 days, at most 120 days) from the query. Answers with data: days, each with date and the counts open, inprogress, onhold, close, and statusText 'CFD computed.' or 'No tasks yet.'. A bad id answers status false with 'companyId and a valid projectId are required.'.
GET/api/v1/agile/milestonesSession or tokeninternalLists the dated milestones of a project, or of every project the caller can open, with how each one is doing. The caller only sees projects they can open, and tasks in private sprints they cannot see are not counted. Reads projectId (id, optional) from the query; a value that is not an id answers status false. Answers with data: milestones (each with milestoneId, name, projectId, projectName, baseline, target, targetField, slipDays, tasks, doneTasks, overdueTasks, openTasks, signedOff, state of done, missed, at-risk or on-track, lastMove, moveCount) and totals (total, onTrack, atRisk, missed, done), and statusText 'Milestones computed.'. With no visible project it answers statusText 'No projects.' and empty lists.
GET/api/v1/agile/provenanceSession or tokeninternalShows who finished the work in a list (sprint) or a project, people or AI agents, with a cost split. The caller must be able to open the project, and for a sprint also the sprint itself. Reads sprintId (id) or projectId (id) from the query, one of them is required. Answers with data: sprint (id and name, or null), projectId, the completion split fields, and margin (with currencySymbol), and statusText 'Provenance computed.'. A missing or bad id answers status false with 'companyId and a valid sprintId or projectId are required.', a missing sprint answers status false with 'Sprint not found.'.
GET/api/v1/agile/sprint-insightsSession or tokeninternalGives extra facts for one list (sprint): which tasks are blocked and for how long, and which tasks were added after the sprint started. The caller must be able to open the sprint's project and the sprint itself. Reads sprintId (id, required) from the query. Answers with data: sprintId, sprintName, projectId, startDate, endDate, blockers (with blockedDays and since), scopeAdds (with action, by, at, done), tasks (each with done, blocked, committed) and hasCommitment, and statusText 'Sprint insights computed.'. A bad id answers status false with 'companyId and a valid sprintId are required.', a missing sprint answers status false with 'Sprint not found.'.
GET/api/v1/agile/velocitySession or tokeninternalGives the velocity of a project: points promised against points finished across its latest closed Scrum sprints, with a rolling average of three. The caller must be able to open the project, and private sprints they are not on are left out unless they are owner or admin. Reads projectId (id, required) and limit (a number, between 1 and 50, default 10) from the query. Answers with data: sprints (each with sprintId, name, startDate, endDate, committed, completed, completedHuman, completedAgent, unchecked, byPattern, rollingAvg) and skipped (closed sprints without a start snapshot), and statusText 'Velocity computed.' or 'No completed sprints yet.'. A bad id answers status false with 'companyId and a valid projectId are required.'.
GET/api/v1/ai-progress/:jobIdNo login guardinternal
POST/api/v1/ai/askSession or tokeninternal
GET/api/v1/ai/ask/build/:projectIdSession or tokeninternal
POST/api/v1/ai/ask/create-tasksSession or tokeninternal
POST/api/v1/ai/ask/planSession or tokeninternal
POST/api/v1/ai/ask/postSession or tokeninternal
GET/api/v1/ai/ask/post/targetsSession or tokeninternal
GET/api/v1/ai/ask/sourcesSession or tokeninternal
POST/api/v1/ai/ask/streamSession or tokeninternal
GET/api/v1/ai/ask/threadsSession or tokeninternal
GET/api/v1/ai/ask/threads/:idSession or tokeninternal
PUT/api/v1/ai/ask/threads/:idSession or tokeninternal
DELETE/api/v1/ai/ask/threads/:idSession or tokeninternal
POST/api/v1/ai/chat-askSession or tokeninternal
POST/api/v1/ai/chat-ask/postSession or tokeninternal
POST/api/v1/ai/chat-summarySession or tokeninternal
POST/api/v1/ai/descriptionSession or tokeninternal
PUT/api/v1/ai/feedbackSession or tokeninternal
DELETE/api/v1/ai/feedback/:idSession or tokeninternal
GET/api/v1/ai/feedback/mineSession or tokeninternal
POST/api/v1/ai/meeting-notesSession or tokeninternal
GET/api/v1/ai/memorySession or tokeninternal
PUT/api/v1/ai/memorySession or tokeninternal
DELETE/api/v1/ai/memorySession or tokeninternal
POST/api/v1/ai/memory/import/confirmSession or tokeninternal
POST/api/v1/ai/memory/import/previewSession or tokeninternal
POST/api/v1/ai/notes-to-tasksSession or tokeninternal
POST/api/v1/ai/notes-to-tasks/proposeSession or tokeninternal
POST/api/v1/ai/notes-to-tasks/undoSession or tokeninternal
POST/api/v1/ai/project/:projectId/tasks/executeSession or tokeninternal
POST/api/v1/ai/project/:projectId/tasks/planSession or tokeninternal
POST/api/v1/ai/project/briefSession or tokeninternal
POST/api/v1/ai/project/clarifySession or tokeninternal
POST/api/v1/ai/project/executeSession or tokeninternal
POST/api/v1/ai/project/guideSession or tokeninternal
POST/api/v1/ai/project/planSession or tokeninternal
POST/api/v1/ai/project/upload-briefSession or tokeninternal
GET/api/v1/ai/qualitySession or tokeninternal
POST/api/v1/ai/quality/held-outSession or tokeninternal
POST/api/v1/ai/selection/improveSession or tokeninternal
POST/api/v1/ai/selection/tasksSession or tokeninternal
GET/api/v1/ai/task-assistSession or tokeninternal
POST/api/v1/ai/task-categorySession or tokeninternal
POST/api/v1/ai/task-next-stepsSession or tokeninternal
POST/api/v1/ai/task-researchSession or tokeninternal
POST/api/v1/ai/task-summarySession or tokeninternal
POST/api/v1/ai/task-valuesSession or tokeninternal
POST/api/v1/ai/transcribeSession or tokeninternal
PUT/api/v1/app-notification/mark-all-readSession or tokeninternal
PUT/api/v1/app-notification/mark-readSession or tokeninternal
DELETE/api/v1/app-notification/mark-read/:key/:idSession or tokeninternal
GET/api/v1/app-notification/mentionsSession or tokeninternal
GET/api/v1/app-notification/notificationSession or tokeninternal
GET/api/v1/audit-logsSession or tokeninternal
POST/api/v1/audit-logs/:id/undoSession or tokeninternal
GET/api/v1/audit-logs/exportSession or tokeninternal
POST/api/v1/auth/loginAuthTrackerNo login guardinternal
GET/api/v1/automationsSession or tokeninternal
POST/api/v1/automationsSession or tokeninternal
PUT/api/v1/automations/:idSession or tokeninternal
DELETE/api/v1/automations/:idSession or tokeninternal
POST/api/v1/automations/:id/applySession or tokeninternal
POST/api/v1/automations/previewSession or tokeninternal
GET/api/v1/calendar/feedsSession or tokeninternal
POST/api/v1/calendar/feedsSession or tokeninternal
DELETE/api/v1/calendar/feeds/:idSession or tokeninternal
POST/api/v1/calendar/feeds/:id/regenerateSession or tokeninternal
GET/api/v1/calendar/ics/:tokenNo login guardinternal
POST/api/v1/cancelmilestonestatusSession or tokeninternal
GET/api/v1/cardcomponentSession or tokeninternal
POST/api/v1/checkSendInviatationSession or tokeninternal
POST/api/v1/clearmilestonestatusSession or tokeninternal
GET/api/v1/clipsSession or tokeninternal
POST/api/v1/clipsSession or tokeninternal
PATCH/api/v1/clips/:idSession or tokeninternal
DELETE/api/v1/clips/:idSession or tokeninternal
GET/api/v1/cloud-oauth/callbackNo login guardinternal
DELETE/api/v1/cloud-storage/:providerSession or tokeninternal
GET/api/v1/cloud-storage/:provider/auth-urlSession or tokeninternal
POST/api/v1/cloud-storage/:provider/importSession or tokeninternal
GET/api/v1/cloud-storage/:provider/thumbnailSession or tokeninternal
GET/api/v1/cloud-storage/:provider/tokenSession or tokeninternal
GET/api/v1/cloud-storage/providersSession or tokeninternal
GET/api/v1/cloud-storage/settingsSession or tokeninternal
PUT/api/v1/cloud-storage/settings/:providerSession or tokeninternal
DELETE/api/v1/cloud-storage/settings/:providerSession or tokeninternal
PUT/api/v1/collection/useridSession or tokeninternal
GET/api/v1/collection/userid/:idSession or tokeninternal
POST/api/v1/commentsSession or tokeninternalSaves a new comment or reply on a project, list or task. The caller must be able to open that project, list and task, else 404 with statusText. Reads data (object, required) from the body, with projectId, sprintId, taskId, message, mediaURL and parentId (ids and text). The author is always the caller, whatever userId is sent. Mentions in message are found and notified, unread counts are raised and agents or AI may start when named. Answers with status and data: the saved comment, plus ai or agents when those started. Bad thread ids answer 400, and failures 500.
PUT/api/v1/commentsSession or tokeninternalEdits or soft-deletes a comment. The caller must be able to open its thread, else 404. Only the author or an owner or admin may change it, but any member may change only pinnedMessage, else 403 with message. Reads id (comment id, required), data (object of fields to set), isProjectComment (boolean) and options (only timestamps, a boolean) from the body. A comment cannot move to another thread or author, answering 400. Answers with status and data: the updated comment. Failures answer 500.
GET/api/v1/comments/action-itemsSession or tokeninternalLists the open assigned comments on one task, oldest first, up to 100. The caller must be able to open the task, else 404. Reads taskId (id, required, else 400), projectId (id) and sprintId (id) from the query. Answers with data: the comments. Failures answer 500.
POST/api/v1/comments/assignSession or tokeninternalAssigns a task comment to a member, or clears its assignee. The caller must be able to post to the task, else 404. Changing an existing assignment is allowed only to the comment's author, the one who assigned it, the current assignee or an owner or admin, else 403 with statusText. Reads id (comment id, required, else 400) and assigneeId (user id, empty to clear) from the body. The assignee must be an active person who can see the task, else 400. Answers with status and data: the updated comment. The new assignee is notified. Failures answer 500.
GET/api/v1/comments/assigned-to-meSession or tokeninternalLists the open comments assigned to the caller, newest assignment first, up to 50. Only those on tasks and docs the caller can still open are returned. Reads nothing from the request. Answers with data: the comments, each with taskName and taskKey for task comments. Failures answer 500.
GET/api/v1/comments/get-paginated-messagesSession or tokeninternalLists the top level comments of a project, list or task chat, newest first. The caller must be able to open the project, list and task, else 404 with statusText. Reads projectId (id, required), taskId (id), sprintId (id), isDefault, mainChat (booleans), skipValue and batchLimit (numbers, default 0 and 25) and tabLeaveTime (a timestamp in milliseconds) from the query. Answers with data: the comments, with a reply summary where threads apply. Failures answer 500.
GET/api/v1/comments/get-searched-messagesSession or tokeninternalSearches the messages of a project, list or task chat. The caller must be able to open the project, list and task, else 404 with statusText. Reads projectId (id, required), sprintId and taskId (ids), searchText (string, matched against message and file names), isPinnedMessage (true for pinned only), skip and limit (numbers, default 0 and 25) and sort (asc or desc) from the query. Answers with data: the matching comments. Failures answer 500.
GET/api/v1/comments/repliesSession or tokeninternalLists the replies in one comment thread, oldest first. The caller must be able to open the thread's project, list and task, else 404 with statusText. Reads parentId (comment id, required, else 400) from the query. Answers with data: the replies, and root: the parent comment. Failures answer 500.
POST/api/v1/comments/resolveSession or tokeninternalMarks an assigned task comment as resolved or open again. The caller must be able to open the task, else 404. Only the assignee, the person who assigned it or an owner or admin may do it, else 403 with statusText. Reads id (comment id, required, else 400) and resolved (boolean, true unless false) from the body. The comment must be assigned, else 400. Answers with status and data: the updated comment. Failures answer 500.
GET/api/v1/commonDateFormateSession or tokeninternal
PUT/api/v1/commonDateFormateSession or tokeninternal
POST/api/v1/companySession or tokeninternal
PUT/api/v1/companySession or tokeninternal
PUT/api/v1/company-invitationSession or tokeninternal
GET/api/v1/connector-oauth/google/callbackNo login guardinternalGoogle's redirect after consent. Public: it exchanges nothing and returns the browser to the signed-in page, which completes the connection.
POST/api/v1/createBucketInstance admininternal
POST/api/v1/createprojectSession or tokeninternalCreates a new project, with its first list, in the workspace. Needs the project.project_create permission, and any people named in AssigneeUserId, LeadUserId or watchers must be members. Reads from the body ProjectName (required), ProjectCode (required), source (required), proposalId (required when the source is upwork), projectIcon, isPrivateSpace (true or false), isTemplate, ProjectRequiredComponent and other project fields. The workspace and creator are set from the session, so a body naming another company is refused with 403. Answers with data: the new project, and statusText: "createProject added successfully". Failures answer status false with statusText giving the reason.
GET/api/v1/currencySession or tokeninternal
PUT/api/v1/currency/:cid/:idSession or tokeninternal
GET/api/v1/customFieldSession or tokeninternal
POST/api/v1/customFieldSession or tokeninternal
PUT/api/v1/customFieldSession or tokeninternal
POST/api/v1/dashboardSession or tokeninternal
GET/api/v1/dashboard/:idSession or tokeninternal
POST/api/v1/dashboard/at-riskSession or tokeninternal
POST/api/v1/dashboard/employee-workloadSession or tokeninternal
POST/api/v1/dashboard/milestone-summarySession or tokeninternal
POST/api/v1/dashboard/my-achievementsSession or tokeninternal
POST/api/v1/dashboard/my-due-soonSession or tokeninternal
POST/api/v1/dashboard/my-leaveSession or tokeninternal
POST/api/v1/dashboard/my-next-tasksSession or tokeninternal
POST/api/v1/dashboard/my-timeSession or tokeninternal
POST/api/v1/dashboard/on-leaveSession or tokeninternal
POST/api/v1/dashboard/project-metricsSession or tokeninternal
POST/api/v1/dashboard/project-utilization-summarySession or tokeninternal
POST/api/v1/dashboard/tasks-by-statusSession or tokeninternal
POST/api/v1/dashboard/team-logged-vs-etaSession or tokeninternal
POST/api/v1/dashboard/team-tasktype-breakdownSession or tokeninternal
GET/api/v1/dashboardsSession or tokeninternal
POST/api/v1/dashboardsSession or tokeninternal
GET/api/v1/dashboards/:idSession or tokeninternal
PUT/api/v1/dashboards/:idSession or tokeninternal
DELETE/api/v1/dashboards/:idSession or tokeninternal
PUT/api/v1/dashboards/:id/cardsSession or tokeninternal
POST/api/v1/dashboards/:id/duplicateSession or tokeninternal
POST/api/v1/deleteUserChatSession or tokeninternal
POST/api/v1/deletemilestoneSession or tokeninternal
GET/api/v1/download/:bucketId/*No login guardinternal
POST/api/v1/draggablemilestoneSession or tokeninternal
POST/api/v1/email-in/:tokenNo login guardinternal
GET/api/v1/email-in/inboxesSession or tokeninternal
POST/api/v1/email-in/inboxesSession or tokeninternal
PUT/api/v1/email-in/inboxes/:idSession or tokeninternal
DELETE/api/v1/email-in/inboxes/:idSession or tokeninternal
POST/api/v1/estimatedTimeSession or tokeninternalRuns a read query over planned time rows and returns the result. Any signed-in member of the workspace may call it. Reads queryeta (an aggregation pipeline) from the body. The query is limited to the rows and projects the caller may see, and a query that breaks that limit answers 400. Answers with the list of result rows itself, not wrapped in data.
PUT/api/v1/estimatedTimeSession or tokeninternalSaves the planned time for one person, task and day. Any signed-in member of the workspace may call it. A member may plan their own time only; planning for others needs an owner or admin role or the Everyone grant on the workload or project timesheet. The project must be one the caller can open, else 403. Reads userId, taskId, projectId (ids), date and minutes (a number from 0 to 1440) from the body, all required, plus id (the row id, to edit a row) and timeZone. Without id it creates the row or updates the one for that person, day and task. Answers with the saved row itself, not wrapped in data; bad input answers 400.
GET/api/v1/estimatedTime/:pid/:tidSession or tokeninternalLists the planned time rows for one task. Any signed-in member of the workspace may call it. Callers without the Everyone grant on the workload or project timesheet see only their own rows, and only for projects they can open; a project they cannot open gives an empty list. Reads pid (project id) and tid (task id) from the path. Answers with the list of rows itself, not wrapped in data.
POST/api/v1/estimatedTime/ai/:tidSession or tokeninternalAsks the AI for an estimate of a task and saves it on the task. Needs a task the caller can open and the permission to change task estimated hours in its project, else 403. Reads tid (task id) from the path and userId and userName (strings) from the body. The task must have a description. Answers with data: totalEstimatedTime, minutes, optimistic, likely, pessimistic, confidence, work_items, reasoning and basedOnSamples. Failures give status false and a statusText.
POST/api/v1/estimatedTime/ai/:tid/proposeSession or tokeninternalAsks the AI for an estimate of a task without saving it. Needs a task the caller can open and the permission to change task estimated hours in its project, else 403. Reads tid (task id) from the path. The task must have a description. Answers with data: minutes, optimistic, likely, pessimistic, confidence, work_items, reasoning, basedOnSamples and previousMinutes. Failures give status false and a statusText.
POST/api/v1/export/csvSession or tokeninternal
POST/api/v1/export/pdfSession or tokeninternal
POST/api/v1/export/xlsxSession or tokeninternal
GET/api/v1/fileExtensionsSession or tokeninternal
PUT/api/v1/fileExtensionsSession or tokeninternal
POST/api/v1/findOneAiModelSession or tokeninternal
POST/api/v1/findOnePromptsSession or tokeninternal
POST/api/v1/folderSession or tokeninternalCreates a folder in a project, or a category in a chat space. The caller needs project.project_folder_create in the project (chat categories are judged by chat access instead). AI agent accounts are refused. Reads projectId (id), folderName (string), parentFolderId (id of a live folder of the same project, optional, folders nest one level) and mainChat (boolean) from the body. The acting user is taken from the session. Answers with data: the new folder, and statusText 'Folder added successfully'. A bad parent answers 400 with the reason, other failures answer status false with the error text.
PATCH/api/v1/folder/:idSession or tokeninternalRenames, moves, archives, deletes or restores one folder, depending on type. The caller must be able to open the folder's project and needs the permission for the change: project.project_folder_name_edit for a rename, that key or project.project_folder_create for a move, project.folder_archive, project.folder_delete or project.folder_restore for the matching deletedStatusKey. AI agent accounts are refused. Reads id (folder id) from the path and type (string, one of editFolderName, updateFolder, moveFolder, required) from the body. For editFolderName it reads folderName and projectId, and also renames the folder copy kept on its tasks. For moveFolder it reads parentFolderId (an id, or null for the top level; required). For updateFolder it reads updateObject, which may only be { $set: { deletedStatusKey } } with 0, 1 or 2, and it carries sub folders and their tasks along. Answers with data: the folder, and statusText 'Folder renamed successfully', 'Folder moved successfully' or 'Folder updated successfully' (updateFolder also returns subfolders). A missing type answers status false with 'type not found', an unknown type answers 400 'Invalid type', a folder that is not found answers status false with 'Folder not found'.
GET/api/v1/freeCompanyCount/:userIdSession or tokeninternal
GET/api/v1/general-remindersSession or tokeninternal
POST/api/v1/general-remindersSession or tokeninternal
PATCH/api/v1/general-reminders/:idSession or tokeninternal
DELETE/api/v1/general-reminders/:idSession or tokeninternal
POST/api/v1/general-reminders/:id/run-nowSession or tokeninternal
POST/api/v1/general-reminders/run-dueSession or tokeninternal
GET/api/v1/generateMongoIdSession or tokeninternal
POST/api/v1/generatePromptSession or tokeninternal
GET/api/v1/generatePrompt/events/:idNo login guardinternal
POST/api/v1/generatePromptChatSession or tokeninternal
GET/api/v1/generateSignedUrl/:bucketIdSession or tokeninternal
POST/api/v1/get-remaining-projectsSession or tokeninternalFetches the full records of projects from a list of ids. Any signed-in member of the workspace may call it, and ids of projects the caller cannot open are dropped from the list first. Reads dataIds (list of project ids, required) from the body. Answers with data: the matching projects. An empty or badly formed list, or one with nothing left after dropping, answers 400 with statusText and field.
POST/api/v1/getAiCategorySession or tokeninternal
POST/api/v1/getAiModelsSession or tokeninternal
GET/api/v1/getBrandSettingsDataNo login guardinternal
GET/api/v1/getBucket/:bucketIdSession or tokeninternal
GET/api/v1/getBucketSize/:bucketIdSession or tokeninternal
GET/api/v1/getEmailTemplatesNo login guardinternal
POST/api/v1/getGlobalTemplateSession or tokeninternal
POST/api/v1/getPromptsSession or tokeninternal
POST/api/v1/getTaskTypeImageSession or tokeninternal
GET/api/v1/getTimeNo login guardinternal
POST/api/v1/getUserProfileSession or tokeninternal
GET/api/v1/getcompany-reffercodeSession or tokeninternal
GET/api/v1/getlogoNo login guardinternal
GET/api/v1/getreferralpercentageSession or tokeninternal
GET/api/v1/github-connect/callbackNo login guardinternal
POST/api/v1/github/access-tokenNo login guardinternal
POST/api/v1/gitlab/access-tokenNo login guardinternal
POST/api/v1/google/access-tokenNo login guardinternal
GET/api/v1/groupByUsersSession or tokeninternal
POST/api/v1/importSettingsSession or tokeninternal
POST/api/v1/importSettingsNotificationSession or tokeninternal
POST/api/v1/importSettingsProjectFunctionSession or tokeninternal
PATCH/api/v1/importTasksSession or tokeninternalCreates many tasks in one list from imported rows. The caller needs task.task_create in the project named by projectData, and must be able to see the target list (a private list is only for its people and the admins). AI agent accounts are refused. Reads tasks (list of task rows), projectData (object with _id and CompanyId), sprint (object with id, the list to import into), statusArray (list of statuses with name, key, type), indexObj, eventId (a string used to report progress) and userData from the body. The list must belong to the project, else it answers 404 'Project or sprint not found.'. A missing permission answers 403 'You do not have permission to import tasks into this project.'. On success answers with data: createdTasks, customFields, adjusted, droppedFieldValues, and statusText 'Task updated successfully.'.
POST/api/v1/importTemplateSession or tokeninternal
POST/api/v1/importUserSession or tokeninternal
GET/api/v1/inboxSession or tokeninternal
POST/api/v1/inbox/clearSession or tokeninternal
POST/api/v1/inbox/clear-allSession or tokeninternal
GET/api/v1/inbox/countsSession or tokeninternal
POST/api/v1/inbox/readSession or tokeninternal
POST/api/v1/inbox/read-allSession or tokeninternal
POST/api/v1/inbox/restoreSession or tokeninternal
POST/api/v1/inbox/restore-allSession or tokeninternal
POST/api/v1/inbox/snoozeSession or tokeninternal
POST/api/v1/inbox/unsnoozeSession or tokeninternal
GET/api/v1/integrations/app-connectionsSession or tokeninternal
GET/api/v1/integrations/catalogSession or tokeninternal
GET/api/v1/integrations/connectionsSession or tokeninternal
POST/api/v1/integrations/connectionsSession or tokeninternal
PUT/api/v1/integrations/connections/:idSession or tokeninternal
DELETE/api/v1/integrations/connections/:idSession or tokeninternal
GET/api/v1/integrations/connections/:id/github-reposSession or tokeninternal
PUT/api/v1/integrations/connections/:id/projectsSession or tokeninternal
POST/api/v1/integrations/connections/:id/reposSession or tokeninternal
DELETE/api/v1/integrations/connections/:id/repos/:projectIdSession or tokeninternal
GET/api/v1/integrations/github/authorizeSession or tokeninternal
POST/api/v1/integrations/github/completeSession or tokeninternal
GET/api/v1/integrations/github/projects/:projectIdSession or tokeninternal
POST/api/v1/invoice/findInstance admininternal
GET/api/v1/main-chatsSession or tokeninternal
POST/api/v1/main-chats/findSession or tokeninternal
POST/api/v1/manageTrackerUserPermissionSession or tokeninternal
GET/api/v1/mediaFilesSession or tokeninternal
GET/api/v1/membersSession or tokeninternalLists the member rows of the workspace. Any signed-in member of the workspace may call it, and the fields on each row depend on the caller: owners, admins and holders of settings.settings_member_list see seat details, others see a smaller set, and userId is hidden on rows that are not accepted yet. Reads nothing from the request. Answers with data: the member rows, and sets a FromCache header when cached. Failures answer 500.
PUT/api/v1/membersSession or tokeninternalChanges fields on a member row, such as role, seat status, removal, manager or designation. Needs the settings.settings_member_list permission, except that any member may change their own dashboardLocked setting. Reads id (member row id, required) and data (object, required) from the body. Only an owner or admin can change another member or managerId. Only an owner can grant the owner or admin role or change an owner. Nobody can change their own role, and the last owner cannot be demoted or removed. Fields such as userId, companyId and userEmail cannot be changed, and $ operators are refused. A manager must pass the reporting line check. Removing a member releases their seat and revokes their API tokens. Answers with status, statusText (Member updated.) and data: the updated row. Refusals answer 400, 403 or 404 with statusText, and other failures 500.
GET/api/v1/members/:idSession or tokeninternalFinds one member row by account id. Any signed-in member of the workspace may call it. Reads id (the member's user id) from the path. Managers of members can find any row of that account, everyone else only finds a live seat. Answers with the member row itself (no data wrapper), or an empty answer when none matches. Failures answer 500.
GET/api/v1/members/:key/:valueSession or tokeninternalChecks whether any member holds a given role or designation. Any signed-in member of the workspace may call it. Reads key (roleType or designation) and value (a whole number) from the path. Anything else answers 400 with message. Answers with isUsed: true when a member has it. Failures answer 500.
POST/api/v1/members/countSession or tokeninternalCounts member rows that match a simple filter. Any signed-in member of the workspace may call it. Reads query (object) from the body, which may use only roleType, designation, status and isDelete, each a string, number or boolean. Anything else answers 400 with statusText. Answers with a list holding totalCount (or an empty list when nothing matches), with no data wrapper. Failures answer 500.
POST/api/v1/members/private-viewSession or tokeninternalAdds, changes or removes a private view saved on the caller's own member row. Any signed-in member may call it, but only on their own row, else 403 with statusText. Reads id (member row id, required), data (object, required), operation (push, update, settings or delete, required) and key (name, title or isPin, used with update) from the body. update and settings also need data.id (the view id) and the view must exist, else 404. Answers with status and statusText (Private view saved.). Bad input answers 400, an unknown row 404, and other failures 500. It also records a note in the project history when the view names a project the caller can read.
POST/api/v1/milestoneSession or tokeninternal
GET/api/v1/milestone/:idSession or tokeninternal
GET/api/v1/milestone/project/:pidSession or tokeninternal
GET/api/v1/milestoneBillingPeriodSession or tokeninternal
GET/api/v1/milestoneRangeSession or tokeninternal
POST/api/v1/milestoneReportSession or tokeninternal
GET/api/v1/milestoneStatusSession or tokeninternal
PUT/api/v1/milestoneStatusSession or tokeninternal
POST/api/v1/mongoOprationSession or tokeninternal
GET/api/v1/notesSession or tokeninternal
POST/api/v1/notesSession or tokeninternal
PATCH/api/v1/notes/:idSession or tokeninternal
DELETE/api/v1/notes/:idSession or tokeninternal
PUT/api/v1/notificationsSession or tokeninternal
GET/api/v1/notifications/:idSession or tokeninternal
GET/api/v1/notifications/preferencesSession or tokeninternal
PUT/api/v1/notifications/preferencesSession or tokeninternal
GET/api/v1/plan-feature-displaySession or tokeninternal
GET/api/v1/portfolioSession or tokeninternal
POST/api/v1/portfolioSession or tokeninternal
PUT/api/v1/portfolio/:idSession or tokeninternal
DELETE/api/v1/portfolio/:idSession or tokeninternal
GET/api/v1/portfolio/:id/rollupSession or tokeninternal
POST/api/v1/portfolio/summarySession or tokeninternal
GET/api/v1/projectSession or tokeninternal
GET/api/v1/project-closeSession or tokeninternalReads the workspace policy for closing inactive projects. Any signed-in member of the workspace may call it. Reads nothing from the body or query. Answers with data: policy and validInactiveMonths.
PUT/api/v1/project-closeSession or tokeninternalChanges the workspace policy for closing inactive projects. Only an owner or an admin may call it, otherwise it answers 403. Reads enabled (true or false) and inactiveMonths (a number from the allowed list) from the body, and needs at least one of them. Answers with data: policy as saved, and statusText: "Auto-close settings updated". A bad value answers 400 with statusText.
GET/api/v1/project-dashboard/:projectIdSession or tokeninternal
GET/api/v1/project-status-templateSession or tokeninternal
POST/api/v1/project-status-templateSession or tokeninternal
PUT/api/v1/project-status-templateSession or tokeninternal
DELETE/api/v1/project-status-template/:idSession or tokeninternal
GET/api/v1/project/:idSession or tokenundocumentedReads one project by its id.
PUT/api/v1/project/:idSession or tokeninternalUpdates fields of one project. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members need the permission tied to each field they change (for example the name, dates, status, assignee or description permissions), and project.project_details for fields without their own key. Reads id (id) from the path and updateObject (object, required), key (one of $set, $unset, $push, $pull, $addToSet; default $set), arrayFilters (list) and timeZone (string) from the body. Server owned fields such as the creator, company or counters cannot be changed and answer 400, and moving a project is refused for agent tokens. People named must be members. Answers with the project record. Failures answer 400 with message (for example a bad source or proposal id) or 500.
PUT/api/v1/project/:id/view-settingsSession or tokeninternalSaves the settings of one view of a project. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.view_list or project.project_details permission. Reads id (id) from the path and viewId (string, required) and settings (object, required) from the body. Answers with data: viewId and the cleaned settings, and statusText: "View saved.". An unknown view or project answers 404.
POST/api/v1/project/:id/viewsSession or tokeninternalAdds a new view to a project, copied from an existing view or built from a view template. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.view_list or project.project_details permission. Reads id (id) from the path. In the body it reads either templateId (with optional title, isPrivate, isPin) or sourceViewId (string, required) with title (required) and optional settings (object). Answers with data: the new view (or a prepared private view), leftOut, and statusText: "View added." A project holds at most 60 views. An unknown view or template answers 404, and a bad body answers 400.
PUT/api/v1/project/allTask/:idSession or tokeninternalChanges the deleted state of tasks in a project, used when a project is closed, deleted, archived or restored. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members need the project.project_delete or project.project_close permission, and agent tokens are refused. Reads id (id) from the path and findObject (required; only ProjectID and deletedStatusKey) and updateObject (required; only deletedStatusKey, a whole number) from the body. Answers with data: matched and modified, and statusText: "Project tasks updated." Bad input answers 400 with statusText.
POST/api/v1/project/checklistSession or tokeninternalAdds, changes or removes items of a project's checklist. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members need the project.project_checklist permission; adding or removing an assignee on an item can be done with either project.project_checklist_assign_remove or project.project_checklist. Reads id (the project id), operation (push, update or delete), checklistItem (an item, or a list of item ids for delete) and key (name, isChecked, assigneeAdd or assigneeRemove, for update) from the body. An update by name or assignee needs checklistItem.id. Answers status true. An unknown project answers 404 and a bad operation answers 400 with message.
GET/api/v1/project/filter/:userIdSession or tokeninternalLists the caller's saved project filters. Any signed-in member of the workspace may call it, but userId (id, from the path) must be the caller's own id or it answers 403. Answers with data: the caller's saved filters of the project kind.
POST/api/v1/project/filter/createSession or tokeninternalSaves a project filter for the caller. Any signed-in member of the workspace may call it, and the filter always belongs to the caller. Reads name (string, required, up to 200 characters), filter (string, required), typeFilter (string, required), filters (list), sortByField and sortByOrder (objects) and userId (must be the caller's own) from the body. Answers with data: the saved filter, and statusText: "Filter saved." A bad field answers 400 with statusText and field, and another user's id answers 403.
DELETE/api/v1/project/filter/delete/:cid/:idSession or tokeninternalDeletes one saved filter of the caller. Any signed-in member of the workspace may call it, but only the owner of the filter can delete it. Reads cid (id, must match the workspace of the request) and id (id, the filter) from the path, and an optional projectId from the query for the history. Answers status true. A wrong company answers 403, a bad id 400, and a filter that is not the caller's or does not exist 404.
PUT/api/v1/project/filter/updateSession or tokeninternalChanges one saved project filter of the caller. Any signed-in member of the workspace may call it, but only the owner of the filter can change it. Reads id (id, required; _id also works) and at least one of name, filters (list), sortByField, sortByOrder (objects) from the body, and userId if sent must be the caller's own. Answers with data: the updated filter, and statusText: "Filter updated." A bad field answers 400, another user's id 403, and a filter that is not found 404.
POST/api/v1/project/personalSession or tokeninternalFinds the caller's personal list project, or creates it the first time. Any signed-in member of the workspace may call it, and it only ever returns the caller's own personal project. Reads nothing from the body or query. Answers with data: project and sprint (its first list), and statusText is "Personal list created" or "Personal list found". Failures answer 400 with message.
POST/api/v1/project/searchSession or tokeninternalSearches the projects, sprints, folders or archived lists the caller can see. Any signed-in member of the workspace may call it, and results only include projects the caller may open (private ones only if assigned or if their role sees all private projects). Reads type (required; one of sprint, folder, projectName, projectFilter, projectFilter_projectName, projectFilter_folder, projectFilter_sprint, showArchiveOnly) from the body, plus search (string), fields (comma separated string), query, sortByField, sortByOrder, showArchived, skip and limit (numbers). Answers with the list of matches itself (no data wrapper), or an empty list if the caller has no active seat. A missing type answers 404 with message.
PUT/api/v1/project/sprint/:idSession or tokeninternalAdds or removes the caller's own favourite star on a list (sprint). Needs access to the sprint and its project, and no extra permission for this own star. Reads id (id) from the path and key ($addToSet or $pull) and updateObject from the body, which must be exactly { favouriteTasks: { userId } } with the caller's own id. Anything else answers 400. Answers with the updated sprint.
GET/api/v1/project/sprintFolder/:idSession or tokeninternalLists the sprints or folders of a project, or counts them. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner). Reads id (id) from the path and collection (required; sprints or folders), count, fields (comma separated string), skip and limit from the query. Sprints the caller may not see are left out unless the caller is an owner or admin, and removed ones are left out. Answers with the list itself (no data wrapper), or a count when count is set. A missing or unknown collection answers 400 with message.
POST/api/v1/project/tagsSession or tokeninternalAdds, renames, recolours or removes a tag defined on a project. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members need the task.task_tag permission. Reads id (the project id), operation (push, update or delete), items (the tag; for update and delete it needs id, the tag's uid) and key (tagName or tagColor, for update) from the body. Answers status true. An unknown project answers 404 and a bad operation answers 400 with message.
GET/api/v1/project/template/customSession or tokeninternalLists the custom project templates of the workspace. Any signed-in member of the workspace may call it. Reads nothing from the body or query. Answers with data: the templates (served from a cache when one is fresh).
POST/api/v1/project/template/customSession or tokeninternalSaves a custom project template for the workspace. Only an owner or an admin may call it, otherwise it answers 403. Reads data (object, required) from the body; data.TemplateName is required, a string of up to 250 characters. Answers with data: the saved template, and statusText: "Template saved." A bad name answers 400 with statusText and field.
DELETE/api/v1/project/template/custom/:idSession or tokeninternalDeletes one custom project template. Only an owner or an admin may call it, otherwise it answers 403. Reads id (id) from the path. Answers status true, or status false with 404 when nothing was deleted.
POST/api/v1/project/template/custom/ai-generateSession or tokeninternalAsks the AI to draft task statuses, task types and project statuses for a project template, without saving anything. Only an owner or an admin may call it, otherwise it answers 403. Reads category (string, required) and useCaseDescription (string) from the body. Answers with data: the draft template (taskStatusData, TemplateTaskType, projectStatusData, finalTemplateTaskStatusData, finalProjectStatusData), matched to the workspace's existing statuses and types. A missing category answers 400, and so does an AI that is not set up.
GET/api/v1/projectRules/:pidSession or tokeninternal
DELETE/api/v1/projectRules/delete/:pidSession or tokeninternal
PUT/api/v1/projectRules/updateSession or tokeninternal
POST/api/v1/projectSetting/autoArchiveSession or tokeninternalSets the rule that archives finished tasks of a project after some days. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.project_details permission for that project. Reads projectId (id, required), enabled (true or false) and afterDays (a number, kept between 1 and 365) from the body. Answers with data: enabled and afterDays as saved. A missing project answers status false with statusText.
GET/api/v1/projectSetting/autoArchive/:pidSession or tokeninternalReads the auto archive rule of a project. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner). Reads pid (id) from the path. Answers with data: enabled (true or false) and afterDays (days, 1 to 365, default 30). A missing project answers status false with statusText.
POST/api/v1/projectSetting/estimationScaleSession or tokeninternalSets the story point scale a project offers. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.project_details permission for that project. Reads projectId (id, required) and scale (one of fibonacci, linear, tshirt, hours; anything else becomes fibonacci) from the body. Answers with data: estimationScale. A missing project answers status false with statusText.
POST/api/v1/projectSetting/migrateSprintsFunInstance admininternalRuns a one time migration that turns the sprints and folders stored inside every project and chat of the workspace into their own records. Only the instance owner may call it, or a script that sends the adminkey header; an API token is refused. Reads nothing from the body or query. Answers status true with statusText: "done" once every project was processed.
POST/api/v1/projectSetting/taskStatusSession or tokeninternalMoves every task in the old statuses of a project over to the new status chosen for each one. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.project_details permission for that project. Reads projectId (id, required), taskStatusKey (list, required) and oldTaskStatus (list, required; each item has key and convertStatus with key, name and type) from the body. Answers status true with statusText: "TASK UPDATE SUCCESSFULLY". A missing field answers status false with a statusText naming it.
POST/api/v1/projectSetting/taskStatus/wipLimitSession or tokeninternalSets or clears the work in progress limit of one status column in a project. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.project_details permission for that project. Reads projectId (id, required), statusKey (required) and wipLimit (a number) from the body. A value that is empty, zero or below clears the limit, and the limit tops out at 999. Answers with data: statusKey, wipLimit, taskStatusData, and statusText says the limit was set or cleared. Failures answer status false with statusText (bad project id, project not found, status not on the project).
POST/api/v1/projectSetting/taskTypeSession or tokeninternalMoves every task of the old task types in a project over to the new type chosen for each one. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner), and owners and admins always pass. Other members also need the project.project_details permission for that project. Reads projectId (id, required), taskTypeKey (list, required) and oldTaskType (list, required; each item has key and convertType with key and value) from the body. Answers status true with statusText: "TASK UPDATE SUCCESSFULLY". A missing field answers status false with a statusText naming it.
GET/api/v1/projectTabsSession or tokeninternal
GET/api/v1/projectdata/taskDataSession or tokeninternalReads one task with its project, list, folder and its subtasks. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner). The caller must also be able to read the task, or it answers 404. Reads taskId (id, required), projectId (id, required) and subTaskLimit (a number, required) from the query. Answers with the list result itself (no data wrapper): the project row with tasks, subtasks (newest first, up to subTaskLimit) and parentFolder. A missing or malformed parameter answers 400 with message.
GET/api/v1/projects-appsSession or tokeninternal
GET/api/v1/ptoSession or tokeninternal
POST/api/v1/ptoSession or tokeninternal
DELETE/api/v1/pto/:idSession or tokeninternal
PUT/api/v1/pto/:id/statusSession or tokeninternal
GET/api/v1/pto/capacitySession or tokeninternal
PUT/api/v1/push-mark-readSession or tokeninternal
POST/api/v1/pushupdateunreadcommentscountSession or tokeninternalChanges the signed-in user's unread count for a project, task, chat message, mention or notification. Any signed-in member of the workspace may call it, but only for their own counts: if userIds (array of ids) names anyone else it answers 403 with statusText. Reads key (number, required: 1 project, 2 task, 3 chat message, 4 mention, 5 notification), read, set and readAll (booleans), messageCount and prevCount (numbers), projectId, sprintId, taskId, messageId and parentTaskId (ids) from the body. Keys 1 and 2 need projectId and userIds, key 2 also needs sprintId and taskId, key 3 needs messageId, key 4 needs readAll. With read, set or readAll it changes only the caller's count; without them only keys 1, 2 and 4 are accepted, else 403. A companyId in the body that differs from the company header is refused. Answers with status and data: a message that the count was updated. A rejected request answers 400 with statusText.
POST/api/v1/recurring-tasksSession or tokeninternalCreates a repeating task rule for a project. The caller needs task.task_create in the project named by projectData. Reads name (string, required), taskName (string, required), projectData (object with _id required, plus CompanyId, ProjectCode, ProjectName), freq (required, daily, weekly or monthly), interval (a number), byweekday (list of numbers 0 to 6), monthday (a number), runHour (a number, default 9), skipIfOpen (boolean), missedPolicy (skip, create or roll), until (a date), sprintId or sprintArray, assignees (list of user ids), taskType, taskTypeKey, priority, points, rawDescription, descriptionBlock and userData from the body. A missing required field answers status false with 'Missing required fields (name, taskName, projectData, freq)'. Answers with data: the saved rule, and statusText 'Recurring task created'. A description that is too long answers 400.
PATCH/api/v1/recurring-tasks/:idSession or tokeninternalChanges a repeat rule. The caller must be able to write in the rule's project (no task permission key is checked here). Reads id (rule id) from the path and any of name, enabled, freq, interval, byweekday, monthday, runHour, skipIfOpen, missedPolicy and until from the body; when the schedule fields change the next run time is worked out again. Answers with status true and statusText 'Updated'. A failure answers status false with the error text.
DELETE/api/v1/recurring-tasks/:idSession or tokeninternalDeletes a repeat rule by switching it off and marking it deleted. The caller must be able to write in the rule's project (no task permission key is checked here). Reads id (rule id) from the path. Answers with status true and statusText 'Deleted'. A failure answers status false with the error text.
POST/api/v1/recurring-tasks/:id/run-nowSession or tokeninternalMakes one task from a repeat rule right now. The caller needs task.task_create in the rule's project. Reads id (rule id) from the path. Answers with data: id (the new task id or null) and skipped (true when the last task is still open and the rule's policy says not to make another), and statusText 'Task created' or 'Skipped, previous instance still open'. A rule that is not found answers status false with 'Definition not found'.
GET/api/v1/recurring-tasks/project/:pidSession or tokeninternalLists the recurring task rules of one project. Needs a project the caller can open (a private project only for people assigned to it or roles that see every private project; a personal list only for its owner). Reads pid (id) from the path. Answers with data: the project's recurring task rules that are not deleted. On an error it answers status false with statusText.
POST/api/v1/recurring-tasks/run-dueSession or tokeninternalRuns every repeat rule of the workspace that is due now. Only an owner or an admin may call it. Reads nothing from the body. Answers with data: processed (rules looked at) and created (tasks made), and statusText 'Processed due recurring tasks'. A failure answers status false with the error text.
GET/api/v1/recurring-tasks/task/:taskIdSession or tokeninternalReads the repeat rule of one task. The caller must be able to open the task's project. Reads taskId (id) from the path. Answers with status true and data: the rule, or null when the task does not repeat. A bad id answers 400 'A valid task id is required.', a task that is not found answers 404 'Task not found.'.
PUT/api/v1/recurring-tasks/task/:taskIdSession or tokeninternalMakes a task repeat, or changes how it repeats. The caller needs task.task_due_date and task.task_create in the task's project. Reads taskId (id) from the path and freq (required, daily, weekly or monthly), interval (whole number from 1 up), byweekday (list of days 0 to 6), monthday (1 to 31), runHour (0 to 23), until (a date), maxRuns (whole number) and missedPolicy (skip, create or roll) from the body. The acting user comes from the session. Answers with data: the rule, and statusText 'Repeat set' for a new rule or 'Repeat updated' for an existing one. A bad schedule or id answers 400 with the reason, a task that is not found answers 404 'Task not found.'.
DELETE/api/v1/recurring-tasks/task/:taskIdSession or tokeninternalStops a task from repeating by removing its repeat rule. The caller needs task.task_due_date in the task's project. Reads taskId (id) from the path. Answers with status true and statusText 'Repeat removed', also when the task had no rule. A bad id answers 400, a task that is not found answers 404 'Task not found.'.
POST/api/v1/refundamountSession or tokeninternal
GET/api/v1/remindersSession or tokeninternal
POST/api/v1/remindersSession or tokeninternal
PATCH/api/v1/reminders/:idSession or tokeninternal
DELETE/api/v1/reminders/:idSession or tokeninternal
POST/api/v1/reminders/:id/run-nowSession or tokeninternal
POST/api/v1/reminders/run-dueSession or tokeninternal
DELETE/api/v1/removeBucket/:bucketIdInstance admininternal
POST/api/v1/removeCacheSession or tokeninternal
POST/api/v1/removeUserNotificationSession or tokeninternal
GET/api/v1/reports/capacitySession or tokeninternal
GET/api/v1/reports/capacity/monthsSession or tokeninternal
GET/api/v1/reports/customSession or tokeninternal
POST/api/v1/reports/customSession or tokeninternal
PUT/api/v1/reports/custom/:idSession or tokeninternal
DELETE/api/v1/reports/custom/:idSession or tokeninternal
POST/api/v1/reports/custom/:id/duplicateSession or tokeninternal
GET/api/v1/reports/custom/:id/runSession or tokeninternal
POST/api/v1/reports/custom/from-templateSession or tokeninternal
POST/api/v1/reports/custom/runSession or tokeninternal
GET/api/v1/reports/custom/templatesSession or tokeninternal
GET/api/v1/reports/schedulesSession or tokeninternal
POST/api/v1/reports/schedulesSession or tokeninternal
PUT/api/v1/reports/schedules/:idSession or tokeninternal
DELETE/api/v1/reports/schedules/:idSession or tokeninternal
POST/api/v1/reports/schedules/:id/run-nowSession or tokeninternal
POST/api/v1/reports/schedules/run-dueSession or tokeninternal
GET/api/v1/reports/varianceSession or tokeninternal
GET/api/v1/reports/variance/summarySession or tokeninternal
GET/api/v1/restricted-extensionsSession or tokeninternal
PUT/api/v1/root-membersSession or tokeninternalLets an invited person accept their invitation to a company. The caller must be signed in, and either holds settings.settings_member_list or sends a body that only links their own account to the invitation. Reads id (invitation row id, required), companyId (id, required), data (object with userId and status, required) and linkId (string, the invitation link token) from the body. The data.userId must be the caller, data.status must be 2, and the invitation must still be pending, carry the right link and be sent to the caller's account or email. Answers with status, statusText (Invitation accepted.) and data: the seat row. Refusals answer 400, 401, 403 or 404 with statusText, and other failures 500.
GET/api/v1/screenshot-retentionSession or tokeninternal
PUT/api/v1/screenshot-retentionSession or tokeninternal
GET/api/v1/screenshot-retention/previewSession or tokeninternal
GET/api/v1/securityPermissionsSession or tokeninternal
PUT/api/v1/securityPermissionsSession or tokeninternal
POST/api/v1/send-fcmSession or tokeninternal
POST/api/v1/setPresetCompanyNo login guardinternal
GET/api/v1/setPresetCompany/:idNo login guardinternal
GET/api/v1/setting/categorySession or tokeninternal
GET/api/v1/setting/companyUserStatusSession or tokeninternal
GET/api/v1/setting/designationSession or tokeninternal
PUT/api/v1/setting/designation/updateSession or tokeninternal
GET/api/v1/setting/projectStatusSession or tokeninternal
PUT/api/v1/setting/projectStatusSession or tokeninternal
GET/api/v1/setting/rolesSession or tokeninternal
PUT/api/v1/setting/roles/updateSession or tokeninternal
GET/api/v1/setting/skillsSession or tokeninternal
PUT/api/v1/setting/skillsSession or tokeninternal
GET/api/v1/setting/taskStatusSession or tokeninternal
PUT/api/v1/setting/taskStatusSession or tokeninternal
GET/api/v1/setting/taskTypeSession or tokeninternal
PUT/api/v1/setting/taskTypeSession or tokeninternal
GET/api/v1/settings/oauthInstance admininternal
POST/api/v1/settings/oauthInstance admininternal
POST/api/v1/slack/command/:companyIdNo login guardinternal
POST/api/v1/sprintSession or tokeninternalCreates a list (sprint) in a project, or a chat channel. The caller needs project.project_sprint_create in the project (chat channels are judged by chat access instead), and any person named as a member of a channel must be a member of the workspace. AI agent accounts are refused. Reads projectId (id), sprintName (string), folder (object with folderId, the folder to put it in, which must be a live folder of the project), private (boolean), icon, mainChat (boolean, for a chat channel), AssigneeUserId and sendMessage (channels only), isPreCompany, from and taskSprintObj from the body. The acting user is taken from the session. Answers with data: the new list, and statusText 'List added successfully'. It answers status false with 'Upgrade your plan' (and isUpgrade true) when the plan's list limit is reached, or 'Channels creation limits have been exceeded' for channels. Other failures answer status false with the error text.
PATCH/api/v1/sprint/:idSession or tokeninternalRenames, updates or deletes one list (sprint) or chat channel, depending on type. The caller must be able to open the list and write in its project, and needs the permission that matches the change: project.project_sprint_name_edit for a rename, project.sprint_delete for deleteChannel, and for updateSprint the restore, delete or archive key for the new deletedStatusKey, or the edit or share keys when it moves a list or changes who may see it. AI agent accounts are refused. Reads id (list id) from the path and type (string, one of editSprintName, updateSprint, deleteChannel, required) from the body. For editSprintName it reads sprintName (string, 1 to 50 characters) and projectId. For updateSprint it reads updateObject, which may only $set deletedStatusKey, private, AssigneeUserId, folderId, folderName, or $addToSet or $pull one member or watcher. A list that is running a Scrum sprint cannot be archived. For deleteChannel it reads companyId. Answers with data: the updated list, and statusText 'Sprint_updated_successfully' (or 'Sprint_deleted_successfully' for a delete). A missing type answers status false with 'type not found', an unknown type answers 400 'Invalid type', a list that is not found answers status false with 'Sprint not found'.
DELETE/api/v1/storage/removeFile/:bucketIdSession or tokeninternal
POST/api/v1/storage/uploadFileSession or tokeninternal
POST/api/v1/storage/uploadFileBase64Session or tokeninternal
GET/api/v1/subscriptionSession or tokeninternal
PUT/api/v1/subscriptionInstance admininternal
GET/api/v1/subscription/:idSession or tokeninternal
POST/api/v1/subscription/findSession or tokeninternal
POST/api/v1/subscriptionsInstance admininternal
GET/api/v1/subscriptions/:idSession or tokeninternal
POST/api/v1/tabSyncTaskSession or tokeninternalReturns the tasks of one list that changed since the person left the browser tab, so the board or table can refresh. Any signed-in member of the workspace may call it, and the rows are limited to tasks the caller may see. Reads pid (project id, required), sprintId (list id, required), istableTask (boolean, required, true for table view and false for board view), tabLeaveTime (a time in milliseconds), item (the group being refreshed, with indexName and mongoConditions or conditions), indexName, sortKey (like 'field:1'), showAllTasks, userId and parentId (to read sub tasks of one parent) from the body. Answers with the raw list of matching rows, not wrapped in data; for board view it is one object holding result (changed tasks) and count. A missing required field or a refused query answers 400 with message.
PUT/api/v1/taskSession or tokeninternalMoves every task of one project between active, closed, deleted and restored states, to follow a change of the project itself. AI agent accounts are refused. The caller must be a member of the workspace and, unless owner or admin, able to open the project, and must hold the permission for the change: project.project_close for 0 to 8, project.project_delete for 0 to 7 or 0 to 1, project.project_list for 7 to 0 or 8 to 0. Reads key (string, must be updateMany), firstParameter (object with ProjectID or objId.ProjectID, and deletedStatusKey as the current state number) and secondParameter (object { $set: { deletedStatusKey } } with the new state number), all required; any other body key is refused. Answers with data: the update result (matchedCount, modifiedCount), and statusText 'Tasks updated successfully.'. A refused request answers 403 with statusText 'Forbidden' and a message; a missing field answers 400.
GET/api/v1/task/:idSession or tokenundocumentedReads one task by its id.
GET/api/v1/task/filter/:userIdSession or tokeninternalLists the saved task filters of the caller. Any signed-in member of the workspace may call it, but only for themselves. Reads userId (id) from the path; if it is not the caller's own id it answers 403 'You can only read your own saved filters.'. Answers with status true and data: the caller's saved filters of kind taskFilter for projectTask, or an empty list. A failure answers 500 with statusText.
POST/api/v1/task/filter/createSession or tokeninternalSaves a task filter for the caller. Any signed-in member of the workspace may call it, and the filter always belongs to the caller. Reads the filter fields from the body, for example name, filters, sortByField, sortByOrder; any _id is dropped and userId and companyId are set by the server. A userId naming someone else answers 403 'A saved filter can only be created for yourself.'. Answers with status true and data: the saved filter. A failure answers 500 with statusText.
DELETE/api/v1/task/filter/delete/:cid/:idSession or tokeninternalDeletes one saved task filter of the caller. Any signed-in member of the workspace may call it, and it can only remove filters the caller owns. Reads cid (company id, must equal the workspace in the companyid header, else 403) and id (filter id) from the path, and projectId from the query only to write a history line. A bad id answers 400, a filter that is not found for the caller answers 404 'Saved filter not found.'. On success answers status true with no data.
PUT/api/v1/task/filter/updateSession or tokeninternalChanges one saved task filter of the caller. Any signed-in member of the workspace may call it, and it can only touch filters the caller owns. The body is a list of two items: first { _id } (the filter id, required, 24 character id), then { $set } holding any of name, filters, sortByField, sortByOrder (other fields are ignored). Reads projectId from the query only to write a history line. A bad id or an empty update answers 400, a filter that is not found for the caller answers 404 'Saved filter not found.'. On success answers status true with no data.
POST/api/v1/task/findSession or tokeninternalRuns a read only search over tasks using a query pipeline and returns the matching tasks. Any signed-in member of the workspace may call it, and the server first narrows the rows to tasks the caller may see. Reads findQuery (a list of query stages, or one stage, required), replaceUndefined (boolean) and inList (a list id, so that tasks added to that list as an extra list are included) from the body. Answers with the raw list of matching rows, not wrapped in data. A missing query answers 400 'Query is required.', a stage that is not allowed answers 400 'Query refused' with message and stage, and other failures answer 500.
POST/api/v1/taskIndexSession or tokeninternalSaves the new place of a task after it is dragged on a board, and changes any field the drag changed. The caller must be able to open the task, with the task.task_list permission in its project. Reads from the body, all required: taskId, projectId, sprintId, taskKey, isFirst (boolean), isFirstWithRecord (boolean), relevantIndex (a number), indexName (one of groupByStatusIndex, groupByPriorityIndex, groupByAssigneeIndex, groupByDueDateIndex), searchKey (one of statusKey, Task_Priority, AssigneeUserId, DueDate), relevantKey and updateData (object with the changed statusKey, Task_Priority, AssigneeUserId, DueDate and so on). The workspace is taken from the header. The work is queued per project and done after the answer, so it answers right away with status true and statusText 'Process Is Start For Index'. A missing field answers 400 '<field> is required'.
GET/api/v1/taskPrioritySession or tokeninternalLists the workspace's task priorities. Any signed-in member of the workspace may call it. Reads nothing from the body or query; the workspace comes from the companyid header. Answers with the raw list of settings documents named for task priorities (not wrapped in data), kept in a cache for a week and marked with a FromCache header when it came from there. A missing header answers 400, a failure answers 500 with message.
PUT/api/v1/taskPrioritySession or tokeninternalChanges the workspace's list of task priorities. Only an owner or an admin may call it. Reads key (string, required, $push or $pull) and updateObject (object, required, holding settings with one priority entry) from the body. A missing or invalid value answers 400 with message. Answers with the raw update result (not wrapped in data), and clears the cached priority list. A failure answers 500 with message and error.
GET/api/v1/teamsSession or tokeninternalLists the teams of the workspace. Any signed-in member of the workspace may call it. Reads nothing from the request. Answers with the list of team records itself (no data wrapper), and sets a FromCache header when the list came from cache. Failures answer 500 with message and error.
POST/api/v1/teams/addTeamSession or tokeninternalCreates a team. The caller needs the settings.settings_create_team permission, checked strictly, else 403 with statusText. Reads name (string, required), value (string, required), teamColor (object with bgColor and color strings, required) and assigneeUsersArray (list of user ids, each must be a member of the workspace) from the body. Any other field is refused. Answers with the saved team record itself. Bad input answers 400 with statusText, and other failures 500.
PUT/api/v1/teams/updateTeamSession or tokeninternalChanges a team's name or colour, or adds or removes one member. The caller needs the settings.settings_team_list permission, checked strictly, else 403 with statusText. Reads id (team id, required), key ($set, $addToSet or $pull, required) and updateObject (object) from the body. With $set, updateObject may hold name, value (both strings) and teamColor. With $addToSet or $pull, it holds one assigneeUsersArray user id, and an added user must be a workspace member. Answers with the updated team record itself. Bad input answers 400 with statusText, and other failures 500.
GET/api/v1/templates/taskStatusSession or tokeninternal
POST/api/v1/templates/taskStatusSession or tokeninternal
PUT/api/v1/templates/taskStatusSession or tokeninternal
DELETE/api/v1/templates/taskStatus/:idSession or tokeninternal
GET/api/v1/templates/taskTypeSession or tokeninternal
POST/api/v1/templates/taskTypeSession or tokeninternal
PUT/api/v1/templates/taskTypeSession or tokeninternal
DELETE/api/v1/templates/taskType/:idSession or tokeninternal
POST/api/v1/timesheetSession or tokeninternal
POST/api/v1/timesheet/billable-summarySession or tokeninternalAdds up billable and non-billable time over a period. Any signed-in member of the workspace may call it. Owners and admins read the whole company and may filter by user; others read only their own time. Projects hidden from the caller are left out. Reads userArray (ids), projectArray (ids), start and end (Unix times in seconds, both needed to filter by date) from the body. Answers with data: the billable split plus scope (company or self).
PUT/api/v1/timesheet/entries/billableSession or tokeninternalMarks time entries billable or not. Any signed-in member of the workspace may call it. Owners and admins may change any entry; others only their own, and other entries are left alone. Reads entryIds (a list of ids, required, else 400) and billable (a boolean, anything but false counts as true) from the body. Answers with statusText Billable updated. and data: updated and billable.
POST/api/v1/timesheet/export-csvSession or tokeninternalExports time entries as a CSV file. Any signed-in member of the workspace may call it. Reads userArray (ids), projectArray (ids), start and end (Unix times in seconds, both needed to filter by date) from the body. Answers with a downloadable CSV file timesheet-export.csv with user, project, date, description, billable and hours. A failure answers 500 with the text Export failed.
POST/api/v1/timesheet/generate-invoiceSession or tokeninternal
GET/api/v1/timesheet/hours-by-sourceSession or tokeninternalAdds up the hours people logged, leaving out AI agent time. Any signed-in member of the workspace may call it. Owners and admins get the whole company, others only their own hours. Reads start and end (Unix times in seconds) from the query, both optional. Answers with data: peopleHours, entryCount, start, end and scope (company or self).
POST/api/v1/timesheet/logDetailSession or tokeninternal
POST/api/v1/timesheet/milestoneSession or tokeninternal
POST/api/v1/timesheet/projectSession or tokeninternal
GET/api/v1/timesheet/ratesSession or tokeninternal
POST/api/v1/timesheet/ratesSession or tokeninternalSaves a billing rate. Only an owner or admin may call it, else 403. Reads scope and rate (required), refId (needed for scopes other than default) and currency (default USD) from the body. It updates the rate for that scope and refId or adds it. Answers with statusText Rate saved. and data: the saved rate; bad input gives status false.
GET/api/v1/timesheet/reminder-settingsSession or tokeninternalReads the company's time reminder settings. Any signed-in member of the workspace may call it. Reads the company header only. Answers with data: settings. Without the company header it answers 400.
PUT/api/v1/timesheet/reminder-settingsSession or tokeninternalChanges the company's time reminder settings. Only an owner or admin may call it, else 403. Reads enabled (a boolean) and userIds (a list) from the body; at least one is needed, else 400. Answers with statusText Reminder settings updated. and data: settings.
POST/api/v1/timesheet/send-remindersSession or tokeninternalSends the log your time reminder emails now. Any signed-in member of the workspace may call it. Reads nothing. It emails the chosen members who have not logged time today, only when reminders are switched on, there are chosen members and today is a working day. Answers with statusText Reminders processed. and data: reminded, total, users and, when nothing was sent, skipped with the reason.
GET/api/v1/timesheet/task/:taskIdSession or tokeninternalGives the time entries logged on one task. Needs a task the caller can open. Reads taskId from the path. The caller sees only their own entries, unless they hold the Everyone grant on the user timesheet for that project, then all. Answers with data: taskId, estimateMinutes, totalMinutes, mineMinutes, seesEveryone and entries (each with userId, startedAt, endedAt, minutes, note, billable, source, running, locked and canEdit). A bad id answers 400 and a missing task 404.
POST/api/v1/timesheet/timelogSession or tokeninternal
POST/api/v1/timesheet/trackerSession or tokeninternal
POST/api/v1/timesheet/userSession or tokeninternal
GET/api/v1/timesheet/weekSession or tokeninternalGives one person's week of logged time, grouped by task, with capacity and approval state. Any signed-in member of the workspace may call it. Only an owner or admin may name another person with userId; for anyone else it is ignored. Reads start and end (dates, required, else 400), userId, projectId, hoursPerDay (a number, default 8) and timeZone from the query. Answers with data: userId, zone, hoursPerDay, workingDays, days, rows, totals, underCapacity, approval and running.
POST/api/v1/timesheet/workloadSession or tokeninternal
PUT/api/v1/timesheet/workload-capacitySession or tokeninternal
POST/api/v1/timesheet/workload-gridSession or tokeninternal
POST/api/v1/timesheet/workload-moveSession or tokeninternal
GET/api/v1/toursSession or tokeninternal
GET/api/v1/trackerNo login guardinternal
POST/api/v1/tracker/createInstance admininternal
DELETE/api/v1/tracker/delete/:idInstance admininternal
PUT/api/v1/tracker/updateInstance admininternal
POST/api/v1/unsetCommentCountsSession or tokeninternalClears stored unread comment counts for a project or list. Any signed-in member of the workspace may call it, and the code checks no project access or role. Reads projectId (id), sprintId (id), searchKey (string) and companyId (id) from the body. One of projectId or searchKey is required, else 400 with statusText. A companyId that differs from the company header answers 403. It removes the matching count fields for every user's count record in the company, not only the caller's. Answers with status, statusText (success) and data: the result of the bulk update. Failures answer 500 with statusText.
POST/api/v1/updateAiModelInstance admininternal
PATCH/api/v1/updateBucket/:bucketIdInstance admininternal
POST/api/v1/updateEmailTemplateInstance admininternal
POST/api/v1/updateTaskIndexOnloadSession or tokeninternalGives a task a board position when it has none for the chosen grouping, as the board loads. The caller must be able to open the task, with the task.task_list permission in its project. Reads taskUpdate (required) from the body: an object with data (the task id) and item (with indexName, searchKey, searchValue). Answers with status true and statusText 'Index Update Successfully' when it set a position, or 'No Need To Processs' when the task already had one. A missing taskUpdate answers status false with 'Task Update Is Required', and a task that is not found answers 404 'Task not found'.
POST/api/v1/updatemilestoneSession or tokeninternal
POST/api/v1/updateunreadcommentscountSession or tokeninternalChanges the signed-in user's unread count for a project, task, chat message, mention or notification. Any signed-in member of the workspace may call it, but only for their own counts: if userIds (array of ids) names anyone else it answers 403 with statusText. Reads key (number, required: 1 project, 2 task, 3 chat message, 4 mention, 5 notification), read, set and readAll (booleans), messageCount and prevCount (numbers), projectId, sprintId, taskId, messageId and parentTaskId (ids) from the body. Keys 1 and 2 need projectId and userIds, key 2 also needs sprintId and taskId, key 3 needs messageId, key 4 needs readAll. With read, set or readAll it changes only the caller's count; without them only keys 1, 2 and 4 are accepted, else 403. A companyId in the body that differs from the company header is refused. Answers with status and data: a message that the count was updated. A rejected request answers 400 with statusText.
PUT/api/v1/userSession or tokeninternal
GET/api/v1/user/:idSession or tokeninternal
POST/api/v1/user/findSession or tokeninternal
POST/api/v1/userAndCompanyCheckSession or tokeninternal
POST/api/v1/validateRefferalCodeSession or tokeninternal
POST/api/v1/verifyTokenSession or tokeninternal
POST/api/v1/versionUpdateNotifyInstance admininternal
POST/api/v1/wasabi/deleteFileSession or tokeninternal
POST/api/v1/wasabi/retriveObjectSession or tokeninternal
GET/api/v1/wasabi/retriveUserProfile/:companyId/:pathSession or tokeninternal
POST/api/v1/wasabi/uploadFileSession or tokeninternal
POST/api/v1/wasabi/uploadFile_64Session or tokeninternal

Everything else ​

MethodPathAuthStatusSummary
GET/No login guardundocumented
GET/.well-known/oauth-authorization-serverNo login guardundocumented
GET/.well-known/oauth-protected-resourceNo login guardundocumented
GET/.well-known/oauth-protected-resource/mcpNo login guardundocumented
PATCH/api/tasks/Session or tokeninternalChanges one task with an older style call that only knows three actions. The caller must be able to open the task and hold the matching task permission in its project: task.task_status for updateStatus, task.task_priority for updatePriority, task.task_name_edit for updateTaskName. Reads action (string, one of those three, any other value is refused with 400) from the body, plus the fields of that action: newStatus, prevStatus (with taskId), task, projectData, isUpdateTask for a status change; firebaseObj (Task_Priority), taskData, priorityObj (with taskId), projectData for a priority change; firebaseObj (TaskName), taskData, obj, projectData for a rename. The acting user is taken from the session, not the body. Answers with data: the result of the action, and statusText 'Task updated successfully.'. A task the caller cannot open answers 404 and a missing task permission answers 403; other failures answer status false with the error text.
POST/api/v3/timeTracker/startSession or tokenundocumentedStarts a tracker timer on a task, for the desktop tracker. Any signed-in member of the workspace may call it. The caller can only start a timer for themselves; a userId naming someone else answers 403. Only users marked as tracker users may start one, else it answers isPermissionDenied. Reads description, projectId and taskId from the body, all required, plus considerActionTime (boolean) and actionTime (a Unix time in seconds) to set the start time. A start in an approved, locked period is refused. Answers with statusText: the id of the new time entry.
POST/api/v3/timetracker/captureSession or tokenundocumentedStores a tracker screenshot on a running timer and moves its end time forward. Any signed-in member of the workspace may call it. Reads file, path, companyId, timeSheetId, key, imageName, prevscreenShot, screenShotTime, memoName and strokes (a JSON string) from a form upload; all are required. companyId must match the company header, timeSheetId must be a timer of the caller that is still running, and path must lie in that timer's own capture folder, or it answers 403 (a path already stored answers 409). The image is the uploaded file. Answers with statusText Data Update Succesfully.
POST/api/v4/timetracker/captureSession or tokenundocumentedStores a tracker screenshot on a running timer and moves its end time forward, for the desktop tracker. Any signed-in member of the workspace may call it. Reads file, path, companyId, timeSheetId, key, imageName, prevscreenShot, screenShotTime, memoName and strokes (a JSON string) from a form upload; all are required. companyId must match the company header, timeSheetId must be a timer of the caller that is still running, and path must lie in that timer's own capture folder, or it answers 403 (a path already stored answers 409). The image is the uploaded file. Only tracker users may use it, else it answers isPermissionDenied. It also reads considerActionTime and actionTime (seconds) to set the end time. Answers with statusText Data Update Succesfully.
USE/apidocsNo login guardundocumented
GET/company-create/events/:idNo login guardundocumented
GET/connectionsNo login guardundocumented
GET/connections/:idNo login guardundocumented
GET/form/:tokenNo login guardundocumented
POST/form/:tokenNo login guardundocumented
GET/healthNo login guardundocumented
GET/importUser/events/:idNo login guardundocumented
GET/mcpNo login guardundocumented
POST/mcpNo login guardundocumented
GET/mcp/manifestNo login guardundocumented
GET/oauth/authorizeNo login guardundocumented
GET/oauth/consentNo login guardundocumented
POST/oauth/consentSession or tokenundocumented
POST/oauth/consent/approval-requestSession or tokenundocumented
GET/oauth/consent/detailsSession or tokenundocumented
POST/oauth/registerNo login guardundocumented
POST/oauth/revokeNo login guardundocumented
POST/oauth/tokenNo login guardundocumented
GET/pickers/google-driveNo login guardundocumented
GET/pickers/google-drive.jsNo login guardundocumented
GET/scim/v2/ResourceTypesNo login guardundocumented
GET/scim/v2/SchemasNo login guardundocumented
GET/scim/v2/ServiceProviderConfigNo login guardundocumented
GET/scim/v2/UsersNo login guardundocumented
POST/scim/v2/UsersNo login guardundocumented
GET/scim/v2/Users/:idNo login guardundocumented
PUT/scim/v2/Users/:idNo login guardundocumented
PATCH/scim/v2/Users/:idNo login guardundocumented
DELETE/scim/v2/Users/:idNo login guardundocumented
GET/share/:tokenNo login guardundocumented
POST/share/:tokenNo login guardundocumented
POST/share/:token/intakeNo login guardundocumented
GET/share/:token/page/:pageIdNo login guardundocumented
GET/task-import/events/:idNo login guardundocumented
GET/versionNo login guardundocumented

Released under the AGPL-3.0 licence.