Tasks error codes
Every public API error code emitted by Tasks, with its HTTP status, its type and a page per code.
Error codes emitted by Tasks. Each code links to its own page with the cause and the action to take.
| Code | Type | HTTP | Description |
|---|---|---|---|
bulk_task_selection_too_large | invalid_request_error | 422 | The bulk operation includes more tasks than a single batch allows (200 by default; the message states the current ceiling). It is not a request limit or a plan limit: it bounds what is processed at once. |
column_has_tasks | conflict_error | 409 | The column you are trying to delete still holds tasks and the request does not say where to move them. To avoid leaving tasks without a place on the board, the deletion is rejected and nothing was changed. |
column_slug_in_use | conflict_error | 409 | Another column of the same project already has an equivalent name. The comparison uses the identifier derived from the name, so two names that differ only in case or punctuation still collide. |
column_slug_reserved | invalid_request_error | 422 | The column name translates into the identifier planned or archived, which are reserved for the statuses of tasks that sit outside the board. Such a column would be indistinguishable from those statuses. |
invalid_custom_field_definition | invalid_request_error | 422 | The custom field definition is not valid: name outside 1 to 60 characters, unknown type, required field without a default value, options on a type that does not accept them, type change after creation, removing an option that tasks use, or an incomplete reordering. error.param points at the exact item. |
invalid_custom_field_value | invalid_request_error | 422 | The value does not fit the custom field type —for example, text in a numeric field or an option that is not in the list— or the field does not belong to the task's project. |
invalid_move_target_column | invalid_request_error | 422 | The column given to receive the tasks is not a valid target: it does not exist, belongs to another project or is the very column being deleted. The deletion was not performed. |
invalid_task_key | invalid_request_error | 422 | The task key is not shaped KEY-N —project key, hyphen and number, such as WEB-42— or the task number is not a positive integer. |
invalid_task_reference | invalid_request_error | 422 | A task referenced in the request body does not exist or belongs to another company; both cases answer the same. error.param names the field that held the reference. |
invalid_task_schedule | invalid_request_error | 422 | The task dates are not consistent: the start date is later than the due date, or one of them does not exist in the calendar (for example, 30 February). |
invalid_task_status | invalid_request_error | 422 | The task target is not valid: the status does not exist, the transition is not allowed, a column and a status are sent together, the column is not in the task's project, or a column is given for a planned or archived task. A task on the board always has a column and one outside it never does. |
invalid_time_entry_period | invalid_request_error | 422 | The time entry period is not valid: the end is before the start, it lasts more than 24 hours, the start is more than one day in the future, a date is invalid, the end of a closed entry is being removed, or the times of a still-running entry are being changed. |
limit_exceeded | payment_required_error | 402 | The company has reached its plan limit of invoices or annual documents; the message says which. In the v1 API it is emitted by time invoicing (POST /v1/projects/{project}/time-invoices), which checks it before creating anything: no draft invoice was generated and no hours were marked as invoiced. |
linked_entity_not_found | not_found_error | 404 | The entity to link does not exist, belongs to another company or belongs to a module the company has not subscribed to; all three cases answer the same. It happens when linking (POST /v1/tasks/{task}/entity-links) and also when creating a task with entity_link in POST /v1/tasks: in that case the task is NOT created. |
project_archived | invalid_request_error | 422 | The project is archived and accepts neither new tasks nor tasks being moved into it. Archiving freezes the project without deleting it. |
project_column_not_found | not_found_error | 404 | The column does not exist, belongs to another project or belongs to another company; all three cases answer the same. A column is only addressable inside the project that contains it. |
project_has_no_columns | invalid_request_error | 422 | The task is being placed on the board, but the project has no column to put it in. An active task always lives in a column. |
project_key_in_use | conflict_error | 409 | The short key is already used by another project of the company, or is still reserved as the former key of a project that changed it. The key names the tasks (WEB-42), so it cannot repeat within the company. |
project_not_found | not_found_error | 404 | There is no project with that identifier or key in the authenticated company. A project belonging to another company answers exactly the same, so the response never reveals whether it exists elsewhere. |
required_custom_field_missing | invalid_request_error | 422 | A value is missing for a custom field that the project declares as required; the message names the field. A required field cannot be left empty. |
task_already_in_project | invalid_request_error | 422 | The task is being moved to the project it is already in, so there is no move to make. |
task_assignee_not_member | invalid_request_error | 422 | The user given as assignee is not a member of the company. A non-existent user, one from another company or one without membership all answer the same, so that other accounts are not revealed. |
task_attachment_not_found | not_found_error | 404 | The attachment does not exist, belongs to another task or belongs to another company; all three cases answer the same. A deleted attachment can no longer be read or downloaded. |
task_attachment_rejected | invalid_request_error | 422 | The file is not accepted as an attachment: it is empty, exceeds 10 MB, or its real type —detected from its content (magic bytes), not from the extension or the header— is not allowed. A surface other than description or comment is also rejected. |
task_calendar_feed_not_found | not_found_error | 404 | The calendar feed (iCal) does not exist, is revoked, belongs to another company or is another user's personal feed; all cases answer the same. Only the web application emits it when rotating or revoking feeds, not the v1 API. |
task_column_capacity_exceeded | conflict_error | 409 | The board scope —the column, or the planned or archived status— has run out of the position range used to order its tasks. It is not a plan limit or a permission problem, but the technical ordering ceiling of that scope. |
task_comment_not_editable | invalid_request_error | 422 | The comment cannot be edited: only its author can change it, and comments imported or brought in by an integration are immutable to preserve what the source said. |
task_comment_not_found | not_found_error | 404 | The comment does not exist, belongs to another task or belongs to another company; all three cases answer the same. A comment is only addressable under the task it was written on. |
task_custom_field_not_found | not_found_error | 404 | The custom field does not exist, belongs to another project or belongs to another company; all three cases answer the same. Each project defines its own fields. |
task_description_too_large | invalid_request_error | 422 | The description exceeds the maximum of 100,000 characters, counted on the submitted Markdown before it is sanitised. The ceiling does not depend on the plan: it protects the editor and storage. |
task_entity_link_not_found | not_found_error | 404 | The link between the task and a document, contact, product or employee does not exist, belongs to another task or belongs to another company; all three cases answer the same. |
task_external_link_not_found | not_found_error | 404 | The external link does not exist, belongs to another task or belongs to another company. A link maintained by an integration (a forge issue or pull request) also answers this way when it is managed as if it were a manual link. |
task_label_name_in_use | conflict_error | 409 | The company already has a label with that name; the comparison is case-insensitive. Labels are shared across all the company's projects. |
task_label_not_found | not_found_error | 404 | There is no label with that identifier in the authenticated company; a label of another company answers the same. Labels belong to the company, not to a specific project. |
task_not_found | not_found_error | 404 | There is no task with that identifier or key in the authenticated company. A task of another company —or, in the employee portal, one not assigned to the caller— answers exactly the same. |
task_relation_cycle | invalid_request_error | 422 | The relation would close a cycle of subtasks or blockers: the target task already depends, directly or indirectly, on the source one, and neither could be completed first. |
task_relation_exists | conflict_error | 409 | These two tasks already have a relation of the same type, in either direction. Repeating it would add no information, so a second one is not created. |
task_relation_not_found | not_found_error | 404 | There is no relation with that identifier between tasks of the authenticated company; a relation of another company, or one already deleted, answers the same. |
task_self_relation | invalid_request_error | 422 | The source and target tasks are the same, and a task cannot be related to itself. |
task_time_entry_invoiced | invalid_request_error | 422 | The time entry is already included in an invoice. While it stays linked it cannot be edited or invoiced again, so that the invoice and the hours do not contradict each other. |
task_time_entry_not_found | not_found_error | 404 | The time entry does not exist, belongs to another task or belongs to another company; all three cases answer the same. |
task_time_not_invoiceable | invalid_request_error | 422 | The requested hours cannot be invoiced and the message names the reason: the project has no billing client or that client no longer accepts invoices, there is no hourly rate or priced product, an entry is not billable, is running or belongs to another project, there are no billable entries, or the selection is ambiguous. |
task_timer_already_running | conflict_error | 409 | You already have a running timer in this company. Each user can have at most one at a time per company, so that recorded time does not overlap between tasks. |
task_timer_not_running | invalid_request_error | 422 | A timer stop was requested, but you have no running timer in this company; it may already have been stopped from another session or device. |
task_upload_link_expired | invalid_request_error | 410 | The upload link no longer works. The subcode says why: expired, because the link timed out (it lives 30 minutes from creation), or consumed, because it was already used once and each link accepts a single submission. |
task_upload_link_not_found | not_found_error | 404 | The upload link is not valid: the token is malformed or matches no link, almost always because it was copied incompletely. An expired or already used link answers with task_upload_link_expired instead. |
Related
Error codes by category
Find an error by the category that emits it.
Full reference table
All codes, HTTP statuses, types and descriptions in one reference.
Error model
Interpret the error envelope and handle errors by code.