Update Saved View
Edit a saved view, reorder it, and set workspace or personal default views in a Blue workspace.
Use the editSavedView mutation to change a saved view’s name, icon, sharing status, or configuration. This page also covers the four related mutations that operate on existing views: updateSavedViewPosition (move one view), reorderSavedViews (reorder a whole section), setWorkspaceDefaultView (set the workspace-wide default), and setUserDefaultView (set your personal default). Saved views are SavedView objects scoped to a workspace (Project).
All examples are sent to https://api.blue.app/graphql with your authentication headers (blue-token-id, blue-token-secret, blue-org-id). Header names are case-insensitive.
Request
Rename a saved view. Only the id is required; include only the fields you want to change.
mutation EditSavedView {
editSavedView(input: { id: "view_123", name: "Q1 Roadmap" }) {
id
name
updatedAt
}
}Parameters
EditSavedViewInput
| Parameter | Type | Required | Description |
|---|---|---|---|
id | String! | Yes | ID of the saved view to update. |
name | String | No | New display name. Cannot be empty; max 100 characters. |
icon | String | No | New icon identifier. Max 50 characters. |
isShared | Boolean | No | Whether the view is shared with all workspace members. Changing this is permission-gated (see Permissions). |
viewConfig | JSON | No | New view configuration. Replaces the entire stored config — send the complete object, not a partial patch. See viewConfig structure. |
Omitted fields are left unchanged. viewType is not part of this input and cannot be edited.
Response
editSavedView returns the full updated SavedView.
{
"data": {
"editSavedView": {
"id": "clm4n8qwx000008l0g4oxdqn7",
"name": "Q1 Roadmap",
"updatedAt": "2026-05-29T14:02:11.000Z"
}
}
}Returns
editSavedView, updateSavedViewPosition, and createSavedView all return the same SavedView! type.
| Field | Type | Description |
|---|---|---|
databaseId | ID | ID of the database the view belongs to. |
id | ID! | Unique identifier of the saved view. |
uid | String! | Short human-friendly identifier. |
name | String! | Display name. |
icon | String | Icon identifier. |
position | Float! | Sort position in the sidebar. |
isShared | Boolean! | Whether the view is shared with all workspace members. |
viewType | SavedViewType! | Layout type: BOARD, DATABASE, CALENDAR, TIMELINE, or MAP. |
viewConfig | JSON! | The view’s configuration object. |
createdBy | User! | The user who created the view. |
project | Project! | The workspace the view belongs to. |
createdAt | DateTime! | When the view was created. |
updatedAt | DateTime! | When the view was last updated. |
Full example
Update the name, icon, sharing status, and configuration in one call. The viewConfig below uses the fields the server actually validates.
mutation EditSavedViewAdvanced {
editSavedView(
input: {
id: "view_123"
name: "Sprint Board"
icon: "kanban"
isShared: true
viewConfig: {
searchQuery: "design"
assigneeIds: ["user_123"]
assigneeMode: "or"
tagIds: ["tag_123"]
tagMode: "and"
hiddenColumns: ["field_123"]
pinnedColumns: { left: ["title"], right: [] }
sort: { type: "customField", field: "field_123", direction: "asc" }
groupBy: { type: "customField", fieldId: "field_123" }
advancedFilters: { op: "and", conditions: [] }
}
}
) {
id
name
icon
isShared
viewType
viewConfig
createdBy {
id
fullName
}
updatedAt
}
}viewConfig structure
viewConfig is a free-form JSON object, but the server validates known keys and rejects the whole object if any are malformed. The total payload must stay under 50 KB; string fields max 1,000 characters; arrays max 100 items.
| Key | Type | Notes |
|---|---|---|
searchQuery | String | Free-text filter. |
dateStart, dateEnd, datePreset | String | Date-range filter inputs. |
assigneeIds, tagIds | String[] | Filter by assignee / tag IDs. |
assigneeMode, tagMode | String | How multiple filters combine — "and" or "or". |
hiddenColumns | String[] | Column IDs to hide. (There is no columns key; list what to hide, not what to show.) |
pinnedColumns | Object | { "left": String[], "right": String[] }. |
sort | Object | { "type": "builtin" | "custom" | "customField", "field": String, "direction": "asc" | "desc" }. All three keys are required; direction is lowercase. |
groupBy | Object | { "type": String, "fieldId"?: String }. type is one of none, list, status, assignee, priority, date, tag, select, createdDate, customField, customDateField, customLookupField, referencedBy. |
advancedFilters | Object | Nested filter tree. Loosely validated (size-limited only). |
timelineZoom | String | day, week, month, quarter, or year. Timeline views only. |
timelineDepDisplay | String | always, selected, or hidden. Timeline views only. |
timelineDateConfig | Object | { "startSource", "endSource" }; each is a date source (createdAt, startedAt, duedAt, updatedAt, completedAt) or { "customFieldId": String }. |
Update view position
Use the updateSavedViewPosition mutation to reorder a view in the sidebar. It takes the view id and a new position: Float!, and returns the updated SavedView!.
mutation UpdateSavedViewPosition {
updateSavedViewPosition(id: "view_123", position: 98302.5) {
id
name
position
}
}{
"data": {
"updateSavedViewPosition": {
"id": "clm4n8qwx000008l0g4oxdqn7",
"name": "Sprint Board",
"position": 98302.5
}
}
}Positions are spaced by 65535 when views are created. To place a view between two others, set position to a value between theirs (a fractional value is fine). Reordering a shared view requires workspace OWNER or ADMIN access. Only the creator can reorder a personal view — see Permissions.
Reorder a whole section
Use the reorderSavedViews mutation to set the order of every view in one section at once. It takes the workspace (projectId: String!), the section (isShared: Boolean!), and the view ids in their new order, and returns the reordered [SavedView!]!.
mutation ReorderSavedViews {
reorderSavedViews(
projectId: "project_123"
isShared: false
ids: ["view_123", "view_456", "view_789"]
) {
id
name
position
}
}ids must list every view in that section exactly once — personal views are the caller’s own views, shared views are all of the workspace’s shared views. A list that is missing a view, contains a duplicate, or names a view from the other section is rejected and nothing is reordered. Blue assigns the new positions in one transaction, so a rejected call never leaves a half-applied order.
Prefer reorderSavedViews over repeated updateSavedViewPosition calls when you are rewriting a whole section, such as sorting it alphabetically.
| Parameter | Type | Required | Description |
|---|---|---|---|
projectId | String! | Yes | The workspace whose views are reordered. |
isShared | Boolean! | Yes | false reorders the caller’s personal views; true reorders the shared views. |
ids | [String!]! | Yes | Every view id in that section, in the order you want, first to last. |
Set the workspace default view
Use the setWorkspaceDefaultView mutation to set a shared view as the default for everyone in the workspace. It takes a projectId: String! (ID or slug), an optional viewId: String, and an optional databaseId: ID, and returns the updated Project! with its defaultSavedView.
Pass databaseId to scope the default to one database in the workspace. The view must then belong to that database, or the call returns FORBIDDEN. A per-database default is read back through the savedViews query’s databaseDefaultViewId field (see List Saved Views), not through Project.defaultSavedView, which keeps reporting the workspace-wide default you set when you omit databaseId.
mutation SetWorkspaceDefaultView {
setWorkspaceDefaultView(projectId: "project_123", viewId: "view_123") {
id
name
defaultSavedView {
id
name
viewType
}
}
}{
"data": {
"setWorkspaceDefaultView": {
"id": "clm4n8qwx000008l0g4oxdqn7",
"name": "Marketing",
"defaultSavedView": {
"id": "clm4n8qwx000009l0g4oxdqn7",
"name": "Sprint Board",
"viewType": "BOARD"
}
}
}
}To clear the workspace default, omit viewId or pass null:
mutation ClearWorkspaceDefaultView {
setWorkspaceDefaultView(projectId: "project_123", viewId: null) {
id
defaultSavedView {
id
}
}
}Both setting and clearing require the caller to be an OWNER or ADMIN of the workspace. A MEMBER (or lower) gets PROJECT_NOT_FOUND, not FORBIDDEN — the workspace lookup is scoped to OWNER/ADMIN membership, so a member appears to have “no such project.” The target view must be shared and belong to this workspace, or the call returns FORBIDDEN.
Set your personal default view
Use the setUserDefaultView mutation to set your own default view for a workspace. It takes a projectId: String! (ID or slug), an optional viewId: String, and an optional databaseId: ID, and returns Boolean!. The view may be personal or shared, but it must belong to the workspace (and to the databaseId you pass, if any). Any workspace member can set their own default. Pass databaseId to scope the default to one database; the result is read back through the savedViews query’s userDefaultViewId field.
mutation SetUserDefaultView {
setUserDefaultView(projectId: "project_123", viewId: "view_123")
}{ "data": { "setUserDefaultView": true } }To clear your personal default, pass null for viewId:
mutation ClearUserDefaultView {
setUserDefaultView(projectId: "project_123", viewId: null)
}Passing a viewId for a view that belongs to a different workspace returns FORBIDDEN.
Errors
| Code | When |
|---|---|
SAVED_VIEW_NOT_FOUND | The view ID does not exist, or you lack access to its workspace. Applies to editSavedView and updateSavedViewPosition. |
FORBIDDEN | You don’t have modify access to the view; you tried to share a view without OWNER/ADMIN; or (for the default-view mutations) the target view is not shared / not in the workspace / not in the databaseId you passed. Message: You are not authorized. |
PROJECT_NOT_FOUND | The workspace doesn’t exist, or — for setWorkspaceDefaultView — you are not an OWNER/ADMIN of it. Also raised by setUserDefaultView when you’re not a member. Message: Project was not found. |
INTERNAL_SERVER_ERROR | The viewConfig you supplied to editSavedView failed validation (wrong shape, over the 50 KB limit, or a bad enum value). Validation failures aren’t modeled as a dedicated code, and the message is masked to Internal server error in production — validate viewConfig against the structure before sending. |
{
"errors": [
{
"message": "You are not authorized.",
"extensions": { "code": "FORBIDDEN" }
}
]
}Permissions
editSavedView requires modify access to the view:
- The creator can modify their own view (personal or shared).
- An
OWNERorADMINcan modify a view only if it is already shared.
An admin who is not the creator cannot edit a private personal view that belongs to another user — the modify-access check throws FORBIDDEN before any field-level check runs. So an admin cannot convert someone else’s personal view to shared.
Reordering with updateSavedViewPosition or reorderSavedViews has separate requirements:
- Shared views: workspace
OWNERorADMINonly. Being the creator does not grant reorder access. - Personal views: the creator only. Owners and admins cannot reorder another user’s personal views.
Changing isShared adds a second check on top of modify access:
| Change | Who can do it |
|---|---|
Set isShared: true (make shared) | OWNER or ADMIN only — and they must already have modify access (i.e. they created it). |
Set isShared: false (make personal) | The creator, or an OWNER/ADMIN. |
For the default-view mutations:
setWorkspaceDefaultView—OWNERorADMINonly (both setting and clearing). Others receivePROJECT_NOT_FOUND.setUserDefaultView— any workspace member, for their own default.