Skip to content

Archive a work item

POST/api/v2/workspaces/{slug}/projects/{project_id}/work-items/{pk}/archive/

Archive a work item: stamp archived_at with the current time and take it out of the active work item set.

This is a bodyless POST — send no JSON at all. The response is the full work item in its usual read shape, with archived_at now populated, so you can confirm the change without a follow-up read.

Archiving is reversible with Unarchive a work item, and it is entirely separate from deleting — an archived work item still exists.

Path Parameters

slug:requiredstring

The workspace slug. It appears in your Plane URLs — in https://app.plane.so/my-team/projects/, the slug is my-team.

project_id:requiredstring (uuid)

The project the work item belongs to.

pk:requiredstring (uuid)

The work item's UUID. This lookup is UUID-only — a PROJ-142 identifier here returns 404.

Body Parameters

None. The endpoint takes no request body; anything you send is ignored.

Archiving twice returns 404

Once archived, a work item is outside the default query set, so a second archive call on the same work item can't resolve it and returns 404 resource_not_found — not a 409, and not a silent success. If you're re-running a job, treat a 404 here as "already archived" rather than an error worth retrying.

Scopes

projects.work_items:write

Errors

StatusCodeCause
400validation_errorThe request could not be processed — for example a pk that isn't a valid UUID.
401unauthorizedMissing or invalid credentials.
403forbiddenYour role or token scope can't archive this work item.
404resource_not_foundNo such work item, it's outside your project or tenant, or it is already archived.
409conflictThe write collides with a protected-resource constraint.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
Archive a work item
bash
curl -X POST \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/work-items/8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13/archive/" \
  -H "X-Api-Key: $PLANE_API_KEY"
Response200
json
{
  "id": "8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13",
  "name": "Fix login redirect loop",
  "identifier": "PROJ-142",
  "sequence_id": 142,
  "priority": "high",
  "state_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
  "type_id": "2d9d1a97-5c6f-4a1e-9d5b-8c2f7e30b6a4",
  "assignee_ids": ["16c61a3a-512a-48ac-b0be-b6b46fe6f430"],
  "label_ids": ["c1b8f3d6-9a44-4e12-8f7a-2b6d5c9e1a03"],
  "parent_id": null,
  "start_date": "2026-01-12",
  "target_date": "2026-01-20",
  "is_draft": false,
  "archived_at": "2026-02-03T11:47:19.204518Z",
  "created_at": "2026-01-14T09:22:41.478363Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "custom_fields": null
}
Response404
json
{
  "type": "https://api.plane.so/errors/resource_not_found",
  "title": "Not Found",
  "status": 404,
  "code": "resource_not_found",
  "detail": "The requested resource was not found."
}

What archiving changes

  • archived_at goes from null to a timestamp. It is the only field the call touches — state, assignees, dates, and labels are untouched.
  • The work item drops out of List work items and out of plain detail reads, including the identifier route.
  • Nothing is deleted. Comments, links, and relations survive, and unarchiving restores the work item exactly as it was.

archived_at is read-only on the work item itself, so you cannot archive by PATCHing a timestamp — this endpoint is the only way in, and unarchive is the only way out.