# GET /api/v2/work-items/{work_item}/subtasks

List a work item's subtasks

- MCP id: work-items.subtasks.index
- Scope: api:read:project_management
- Permission: project_management::view_backlog
- Rate cost: 1 unit, read bucket. `view=detail` makes it 3. Adds: each include +1, `q` +2.
- Cache-Control: private, no-store

Returns one work item's checklist subtasks in their own checklist order, `order` ascending with the id as the tiebreaker.

There is no organisation-wide collection of subtasks: a checklist row only means anything under the work item it belongs to, so this nested path is the only way to list them and `filter[work_item_id]` does not exist. Listing additionally requires `project_management::manage_work_items`. Defaults to the summary view, which omits the rich-text `description`; pass `view=detail` for it, or `include=work_item` to expand the work item each row points at.

## Parameters
- work_item (integer or string, path): The WorkItem's numeric id. Or its issue_key, matching `[A-Z][A-Z0-9]*-[0-9]+`.
- view (string, optional): Which field set to render.
- per_page (integer 1 to 100, optional): Rows per page. At most 25 when `include` names a to-many relation; a larger value is 400 invalid-query-parameter.
- cursor (string, optional): Opaque keyset cursor from a previous page's links.next. Never construct one by hand.
- page (integer 1 to 1000, optional): Opt in to page-number paging: 1-based, at most 1000. Omit it, the default, to page by opaque cursor, which is what links.next hands you. Cannot be combined with cursor. Published only on collections that count their rows on every request. This collection's default sort is a display position that changes whenever someone drags the list into a new order in plnnrly, so a page number can skip or repeat a row if the list is reordered between two page requests. These collections rarely exceed one page; for a stable walk, send sort=id and follow links.next without page.
- filter[created_at] (timestamp (YYYY-MM-DDThh:mm:ssZ), optional): Creation timestamp. Pair with `sort=id` for a stable full export. Operators: = gte lt.
- filter[is_resolved] (boolean, optional): Narrow the checklist to the ticked-off or the outstanding subtasks.
- filter[updated_at] (timestamp (YYYY-MM-DDThh:mm:ssZ), optional): Last-write timestamp. Use for incremental sync. Operators: = gte lt.
- q (string, optional): Free-text search over `title`. At most one substring match per request: `q` together with a `contains` filter is 400 invalid-query-parameter.
- sort (string, optional): Up to three keys, comma-separated, each optionally prefixed with `-` for descending.
- include (string, optional): Comma-separated names to inline, at most five.
- X-Request-Id (header, optional): 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.
- If-None-Match (header, optional): The ETag a read is conditional on. A match is answered 304 with no body.

## Response 200
- id (integer, required): Unique identifier.
- work_item_id (integer, required, server-assigned): The work item whose checklist this subtask belongs to. Taken from the path on create and not writable.
- title (string ≤ 255, required): Subtask title, as shown on the checklist row. This is the field `?q=` searches.
- description (html or null, required, detail only): Optional note on the subtask. HTML from the rich editor, sanitised on read and on write. Null when the subtask is just a title.
- is_resolved (boolean, required): Whether the subtask is ticked off.
- order (integer, required, server-assigned): Position in the work item's checklist. Assigned on create as the next position in that checklist, changed only by dragging in plnnrly, and not writable.
- created_at (timestamp (YYYY-MM-DDThh:mm:ssZ), required): Creation timestamp.
- updated_at (timestamp (YYYY-MM-DDThh:mm:ssZ), required): Last-write timestamp; use for incremental sync.
- work_item (Ref or WorkItemSummary, required): The work item this subtask hangs off.
- links (SubtaskLinks, required)
  - self (url, required): The canonical URI of this record.

## Errors
- 403 forbidden-by-policy | insufficient-permission | insufficient-token-scope: Forbidden.
- 304 : Not modified.
- 400 idempotency-key-required | invalid-cursor | invalid-query-parameter | malformed-request | unsupported-parameter: Bad request.
- 401 token-expired | unauthenticated: Unauthenticated.
- 404 endpoint-not-found | resource-not-found: Not found.
- 406 not-acceptable: Not acceptable.
- 429 rate-limit-exceeded: Too many requests.
- 500 internal-error: Server error.
- 503 tenant-unavailable: Service unavailable.

## Example
```bash
curl -G \
  'https://<your-url>/api/v2/work-items/1/subtasks' \
  --data-urlencode 'filter[is_resolved]=false' \
  -H 'Authorization: Bearer <token>' \
  -H 'Accept: application/json'
```
