# GET /api/v2/workflow-statuses

List workflow statuses

- MCP id: workflow-statuses.index
- Scope: api:read:workflows
- Permission: workflows::read
- Needs the sprints feature on your organisation
- Rate cost: 1 unit, read bucket. `view=detail` makes it 3. Adds: each include +1, `q` +2.
- Cache-Control: private, max-age=60

Returns the organisation's workflow statuses (the board columns work items sit in) in workflow order, with the id as the tiebreaker.

Statuses created through this API are created at position 0, so they tie with each other and sort by id. There is no nested path for one workflow's statuses: scope the collection with `filter[workflow_id]` instead, which is the URL a workflow's `links.statuses` points at. Available only while the Sprints feature is enabled.

## Parameters
- 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_resolution] (boolean, optional): Whether reaching the status resolves the work item.
- filter[updated_at] (timestamp (YYYY-MM-DDThh:mm:ssZ), optional): Last-write timestamp. Use for incremental sync. Operators: = gte lt.
- filter[workflow_id] (integer, optional): Workflow the status belongs to. This is how you list one workflow's statuses: there is no nested path for them. Operators: = in.
- q (string, optional): Free-text search over `name`. 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.
- workflow_id (integer, required): Workflow this status belongs to. A status cannot be moved to another workflow: its transitions and the work items sitting in it belong to this one.
- name (string ≤ 255, required): Status name as shown on the board column and the status badge, e.g. `To do`.
- color (string ≤ 255, required): Six-digit hex colour, e.g. `#6b7280`. A stored value that is not six-digit hex reads back as `#6b7280`, so writing this field back unchanged replaces the malformed original.
- is_resolution (boolean, required): Whether a work item reaching this status counts as resolved. Drives the backlog's done state and what a completed sprint carries over.
- order (integer, required, server-assigned): Position within the workflow, left to right on the board; set by dragging in plnnrly and not writable. API-created statuses are created at 0 and fall back to the id tiebreaker.
- 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.
- workflow (Ref or WorkflowSummary, required): Workflow this status belongs to.
- links (WorkflowStatusLinks, 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/workflow-statuses' \
  --data-urlencode 'filter[workflow_id]=4' \
  --data-urlencode 'filter[is_resolution]=false' \
  --data-urlencode 'include=workflow' \
  -H 'Authorization: Bearer <token>' \
  -H 'Accept: application/json'
```
