Create a work item
POSThttps://
Creates a work item and returns it in the detail view with a Location header.
Access
- Token scope
- api:
write: project_management Without it:
403 insufficient-token-scope. - Permission
- project_management::
manage_work_items Without it:
403 insufficient-permission. - Rate cost
- 1 unit, write bucket. A write costs the same whatever
viewyou ask for. - Also
- Accepts
Idempotency-Key. Never cached:private, no-store. Unknown body keys are refused, never dropped.
Both are checked, scope first. A token never does more than its user. How access is checked
The issue key is generated from the project's customer code and a per-customer sequence; order places the item last in its sprint or backlog. reporter_id is always the authenticated user: there is no way to file on somebody else's behalf. Omit workflow_status_id and work_type_id and the server picks both; in an organisation with no work types, or a project whose workflow has no statuses, that is a 409 state-conflict with conflict.reason unconfigured rather than a validation error about a key you never sent; the fix is an admin action. label_ids replaces the label set outright, and drive_item_ids the set of linked drive documents; each id must name a document the caller may open, and attaching one additionally requires the project_drive prefix's access permission and a token scope covering it. task_id must name a task in the project, and an item placed in the running sprint of a sprint project needs one; a simple-mode project does not. A work item cannot be moved between projects afterwards, so pick the project carefully.
Query parameters
Unknown parameters are refused with 400, naming the parameter.
Request headers
A correlation id of your own. It is recorded in our logs next to the server's request id but never returned: the response header always carries the server's id. A value that does not match the pattern is discarded silently, never rejected.
Request body
Unknown keys are refused with 422, naming the key.
Project this work item belongs to. It cannot change: the issue key was allocated from the project's customer code.
Work item description. HTML from the rich editor, sanitised on read and on write. Mention spans are preserved verbatim, so pass them back unchanged. Detail view only.
Relative priority. Defaults to normal on create; null only on a legacy item that was never prioritised.
highest- Drop everything: work on this ahead of anything else.
high- Take this before normal work, but not ahead of the current task.
normal- The default: ordinary sprint or backlog work.
low- Pick this up once higher-priority work is clear.
lowest- Nice to have, with no expectation it is scheduled at all.
New values may be added.
Remaining estimate, in minutes. Null where none was entered, in which case plnnrly derives one from the estimate and the logged time.
Name of the place the work happens, as picked from the address search in plnnrly. Null when no location was set. Send it together with location_latitude and location_longitude; null all three to clear the location. Detail view only.
Required when location_latitude, location_longitude is present.
Formatted address of the location, when the place has one. Detail view only.
Latitude of the location in decimal degrees, -90 to 90. Detail view only.
Required when location_name, location_longitude is present.
Longitude of the location in decimal degrees, -180 to 180. Detail view only.
Required when location_name, location_latitude is present.
Work type of this item.
Current workflow status. Not writable through PATCH: moving between statuses is POST work-items/{work_item}/actions/transition, because the move is validated against the project workflow.
Kanban task this work item is booked against, when it is booked against one. It must belong to the item's project. A sprint project books the running sprint's hours through it, so an item in that project's running sprint needs one; a simple-mode project does not. Setting it also makes the task's owner the assignee. Follow it to /api/v2/tasks/{task}.
User the work is assigned to. Null on an unassigned item. On a sprint project, setting it also moves the item to that user's only open task in the same budget, or in the project when the item has no task yet; with several or no candidates the task is left as it is.
Sprint the item sits in. Null means it is in the backlog.
Parent work item, for a sub-issue. Null on a top-level item.
Labels on this work item. label_ids takes at most 50 ids and replaces the whole set: a label you leave out is removed. Build it from links.labels, which lists every label while the Sprints feature is enabled, not from include=labels, which stops at 25.
Drive documents linked to this work item that you may open. drive_item_ids takes at most 25 ids and replaces the whole set: a document you leave out is unlinked, and so is every linked document you cannot open. Build it from links.drive_items, not from include=drive_items, which stops at 25. Expanding it additionally requires the project_drive prefix's access grant and a token scope covering it.
Response 201
Returns a WorkItem in the detail view.
Headers
ETag- A strong validator of exactly this representation.
Idempotency-Replayedtruewhen this response was replayed from a storedIdempotency-Keyrather than produced by a new write.Location- The absolute URL of the created or queued resource.
RateLimit- The IETF
httpapi-ratelimit-headersform of your remaining allowance on the tightest bucket this request touched. RateLimit-Policy- The ceiling and window of that bucket, as
<limit>;w=<seconds>. X-Request-Id- The server-generated ULID correlating this response with our logs.
Every response also carries Cache-Control, Vary, X-Content-Type-Options, X-Plnnrly-Api-Version, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset. Headers and versioning
Human-readable key, e.g. ACM-123, allocated by the server from the project's customer code and a per-customer sequence. It also works in the path: GET work-items/ACM-123 works. This is one of the two fields ?q= searches.
Work item description. HTML from the rich editor, sanitised on read and on write. Mention spans are preserved verbatim, so pass them back unchanged. Detail view only.
Relative priority. Defaults to normal on create; null only on a legacy item that was never prioritised.
highesthighnormallowlowest
New values may be added.
Remaining estimate, in minutes. Null where none was entered, in which case plnnrly derives one from the estimate and the logged time.
Name of the place the work happens, as picked from the address search in plnnrly. Null when no location was set. Send it together with location_latitude and location_longitude; null all three to clear the location. Detail view only.
Formatted address of the location, when the place has one. Detail view only.
Latitude of the location in decimal degrees, -90 to 90. Detail view only.
Longitude of the location in decimal degrees, -180 to 180. Detail view only.
Position within the sprint or backlog, and the default sort. Not writable through PATCH: move an item with POST work-items/{work_item}/actions/move and list: backlog.
Position within the board column. Not writable through PATCH: move a card with POST work-items/{work_item}/actions/move and list: board.
Revision counter, bumped once per write. It is the ETag's revision: send it back as If-Match to detect a concurrent edit, which answers 412.
Project this work item belongs to. It cannot change: the issue key was allocated from the project's customer code.
Kanban task this work item is booked against, when it is booked against one. It must belong to the item's project. A sprint project books the running sprint's hours through it, so an item in that project's running sprint needs one; a simple-mode project does not. Setting it also makes the task's owner the assignee. Follow it to /api/v2/tasks/{task}.
Current workflow status. Not writable through PATCH: moving between statuses is POST work-items/{work_item}/actions/transition, because the move is validated against the project workflow.
User the work is assigned to. Null on an unassigned item. On a sprint project, setting it also moves the item to that user's only open task in the same budget, or in the project when the item has no task yet; with several or no candidates the task is left as it is.
User who filed the work item. Always the authenticated user at create time; there is no way to file on somebody else's behalf.
Absolute URL that opens this work item in plnnrly, on the organisation's own hostname. It is a stable link, safe to store: it redirects to the first of the project's backlog, all-work list or board the signed-in user may open, and opens the item there; it lands on the project page when none of them applies. Read-only.
The workflow status this item currently sits in. Always present.
The parent work item, on a sub-issue.
The user the work is assigned to. Expanding it additionally requires the users prefix's read grant and a token scope covering it.
The user who filed the work item. Expanding it additionally requires the users prefix's read grant and a token scope covering it.
The work type of this item. Expanding it additionally requires the work_types prefix's read grant and a token scope covering it.
The sprint this item sits in, when it is not in the backlog.
Number of linked drive documents the caller may open. Archived documents are not counted.
Show 8 child fields
Every label on this work item, paginated. Present only while the Sprints feature is enabled, as GET /labels is.
Labels on this work item. label_ids takes at most 50 ids and replaces the whole set: a label you leave out is removed. Build it from links.labels, which lists every label while the Sprints feature is enabled, not from include=labels, which stops at 25.
Wrapped in { data, meta }; meta.truncated says whether the cap was hit and meta.count is the full count.
Drive documents linked to this work item that you may open. drive_item_ids takes at most 25 ids and replaces the whole set: a document you leave out is unlinked, and so is every linked document you cannot open. Build it from links.drive_items, not from include=drive_items, which stops at 25. Expanding it additionally requires the project_drive prefix's access grant and a token scope covering it.
Wrapped in { data, meta }; meta.truncated says whether the cap was hit and meta.count is the full count.
Show 5 child fields
The kind of record owner points at; it says which branch of owner applies.
projectcustomerorganizationuser
New values may be added.
The project, customer, organisation or user whose drive this item lives in.
Which form you get depends on owner_type.
projectRefcustomerReforganizationRefuserRef
Comments on this work item, newest first, capped at 25. Follow links.comments for the rest.
Wrapped in { data, meta }; meta.truncated says whether the cap was hit and meta.count is the full count.
Checklist subtasks on this work item, capped at 25. Follow links.subtasks for the rest.
Wrapped in { data, meta }; meta.truncated says whether the cap was hit and meta.count is the full count.
Errors
415 Unsupported media type.
422 Unprocessable content.
7 errors every operation can return: 400, 401, 404, 406, 429, 500, 503
400 Bad request.
idempotency-key-requiredinvalid-cursorinvalid-query-parametermalformed-requestunsupported-parameter
401 Unauthenticated.
404 Not found.
406 Not acceptable.
429 Too many requests.
500 Server error.
503 Service unavailable.
This path allows GET, POST. Anything else answers 405.
Something wrong or missing on this page? Tell us