---
title: "GET /portfolio/{portfolioId}/views/{viewId}"
method: GET
path: "/portfolio/{portfolioId}/views/{viewId}"
tags: ["Views"]
---

# GET /portfolio/{portfolioId}/views/{viewId}

`GET /portfolio/{portfolioId}/views/{viewId}`

## Request

- Base URL: `https://api.craft.io`
- URL: `https://api.craft.io/portfolio/{portfolioId}/views/{viewId}`
- Auth: API key in header `x-api-key`

A single portfolio view's full configuration, by its id.

## Path parameters

- `portfolioId` string, required
- `viewId` string, required

## Query parameters

- `includeRaw` boolean
- `includeCompleted` boolean

## Response `200`

The view configuration

- ViewDetail
  - `viewId` string, required
  - `name` string, required
  - `viewType` string, required
  - `ownerType` 'personal' | 'workspace', required
  - `category` string
  - `workspaceId` string
  - `portfolioId` string
  - `webUrl` string
  - `controllers` ViewControllers, required
    - `sortBy` string
    - `sortDirection` 'asc' | 'desc'
    - `groupBy` string
    - `swimLanesBy` string
    - `sortByName` string: Display names for whichever of the axes above is a custom field. Every other axis already comes back as a name — "status", "importance" — and only a custom field is returned as `custom:<id>`, because that id is also what the write path takes. So a reader had an opaque number and no way to say what the view was grouped by without a second call, and an assistant describing a view printed the id at the user. Added alongside rather than replacing the value: `custom:<id>` is the input format axisToWire parses, and external clients read a view and write it back. Changing it would break them.
    - `groupByName` string
    - `swimLanesByName` string
  - `columns` string[]
  - `layout` string[]
  - `compactMode` string: Card density on a card-based view: `compact` or `default`.
  - `filters` RecordStringUnknown, required: Construct a type with a set of properties K of type T
  - `listItemsParams` RecordStringString, required: Construct a type with a set of properties K of type T
  - `listItemsTool` 'list_items' | 'list_portfolio_items' | 'list_feedback_items', required: Which list tool `listItemsParams` belongs to. Feedback views are the reason this is stated rather than assumed — their items are not work items.
  - `unsupportedFilters` UnsupportedFilter[]: Filters the list endpoints cannot reproduce — the result will be wider.
    - `filter` string, required
    - `reason` string, required
  - `inactiveControllers` InactiveController[]: Axes the view stores but the app does not apply, so they are left out of `controllers` — which then reads the way the app shows the view.
    - `controller` 'groupBy' | 'swimLanesBy', required
    - `storedValue` string, required
    - `reason` string, required
  - `columnColors` RecordStringString: Construct a type with a set of properties K of type T
  - `raw` WireView: A view exactly as the views service stores it. Unknown props round-trip.
    - `id` string
    - `name` string
    - `categoryId` string
    - `workspaceId` string
    - `personId` string, nullable
    - `ownerType` string
    - `viewType` string
    - `orderIndex` string
    - `category` string, nullable
    - `nameId` string, nullable
    - `description` string, nullable
    - `viewFields` string[], nullable
    - `compactViewFields` string[], nullable
    - `compactMode` string, nullable: Card density on a card-based view; empty string means never set.
    - `groupBy` string, nullable
    - `groupByCustomFieldId` string, nullable
    - `secondaryGroupBy` string, nullable
    - `secondaryGroupByCustomFieldId` string, nullable
    - `sortBy` string, nullable
    - `sortByCustomFieldId` string, nullable
    - `reverse` boolean, nullable
    - `isChanged` boolean
    - `okrHierarchy` string, nullable
    - `fieldFilters` RecordStringUnknown: Construct a type with a set of properties K of type T
    - `filters` RecordStringUnknown: Construct a type with a set of properties K of type T

## Other responses

- `404`: No view found

## Changes

- **2026-11-02** `2972a1b05ab1`: 1 info
  - added the optional property `inactiveControllers` to the response with the `200` status
- **2026-10-20** `10d02d3ad149`: 3 info
  - added the optional property `controllers/groupByName` to the response with the `200` status
  - added the optional property `controllers/sortByName` to the response with the `200` status
  - added the optional property `controllers/swimLanesByName` to the response with the `200` status
- **2026-10-01** `6009bb084cb5`: 1 info
  - added the optional property `error` to the response with the `404` status
- **2026-09-10** `0ded52245043`: 1 info
  - added the optional property `columnColors` to the response with the `200` status
- **2026-08-19** `df0d980eb1e3`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/craft/apis/craft-io-public-api/changes/portfolio/:portfolioId/views/:viewId/get.md)

---

[API](https://skmtc.dev/craft/apis/craft-io-public-api.md) - [All operations](https://skmtc.dev/craft/apis/craft-io-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/craft/apis/craft-io-public-api/revisions/2972a1b05ab1?raw)
