Skip to content

Get a work item

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

Retrieve one work item by its UUID. This is the endpoint to use after a list call, or any time you already hold the work item's id.

Unlike the list endpoint, this response populates custom_fields — the work item type's custom property values, keyed by property name. If you only have a PROJ-142-style key and not the project UUID, use Get a work item by identifier instead.

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.

Query Parameters

expand:optionalstring

Comma-separated relations to embed alongside the ids: state, type, parent, assignees, labels.

Expansion is separate-key — ?expand=state keeps state_id and adds a state object next to it. An unknown value is a 400.

Archived work items are not returned

An archived work item sits outside the default query set, so a read of one returns 404 — the same response as a work item that never existed. Unarchive it first if you need to read it again. See Archive a work item.

Scopes

projects.work_items:read

Errors

StatusCodeCause
401unauthorizedMissing or invalid credentials.
403forbiddenYour role or token scope can't read work items in this project.
404resource_not_foundNo such work item, it belongs to another project or tenant, or it's archived.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
Get a work item
bash
curl -X GET \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/work-items/8f4c2b1e-0d3a-4f7b-9c21-6e5a8b7d4f13/" \
  -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": null,
  "created_at": "2026-01-14T09:22:41.478363Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "custom_fields": {
    "severity": {
      "id": "b52e7c18-4d3f-4a90-8e61-0f7a3c9d2b45",
      "value": "Sev-1",
      "value_detail": {
        "id": "7c0a5f39-2e84-4b17-9a6c-1d8e4f2b60c9",
        "name": "Sev-1",
        "logo_props": {}
      }
    }
  }
}
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": null,
  "created_at": "2026-01-14T09:22:41.478363Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "custom_fields": {},
  "state": {
    "id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
    "name": "In Progress",
    "color": "#3f76ff",
    "group": "started"
  },
  "assignees": [
    {
      "id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
      "display_name": "ana",
      "avatar_url": "https://assets.plane.so/avatars/ana.png",
      "email": "ana@example.com"
    }
  ]
}

What you get here that a list doesn't give you

  • custom_fields — the work item type's custom property values. The list endpoint returns null for this field on every row to avoid resolving properties per row; only single-item reads populate it.
  • Cheaper expansion?expand= works on both, but expanding one work item is a fixed cost while expanding a full page multiplies it.

Everything else — the field set, the sparse *_id shape — is identical to a row from List work items.