Update workspace features
Turn workspace features on or off. The update is partial — send only the flags you want to change, and every field you omit keeps its current value. Omitting a field is not the same as sending null.
The response is the full feature object after the change, so you never need a follow-up GET to confirm what happened.
Toggling is_work_item_types_enabled moves the write surface
This flag decides whether work item types are managed at the workspace or the project level. Flipping it changes which endpoints accept type and property writes for every client in the workspace, and in-flight integrations start getting 409 from the surface they were using. Treat it as an administrative action, not a runtime decision. See Work item type modes.
Path Parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs — in https://app.plane.so/my-team/projects/, the slug is my-team.
Body Parameters
Every field is optional. id and created_at are read-only — sending them has no effect.
is_work_item_types_enabled:optionalbooleanManage work item types at the workspace level (true) or per project (false). This is the work item type mode switch — read Work item type modes before changing it.
work_item_type_default_level:optionalintegerThe default level applied to work item types in this workspace. The schema declares no enum and no bounds, so it accepts any integer.
is_workitem_hierarchy_enabled:optionalbooleanAllow work items to be nested into a parent and child hierarchy. Note the spelling — no underscore between work and item.
is_project_grouping_enabled:optionalbooleanAllow projects to be organized into groups in the workspace.
is_teams_enabled:optionalbooleanEnable teamspaces for the workspace.
is_wiki_enabled:optionalbooleanEnable the workspace-level wiki.
is_initiative_enabled:optionalbooleanEnable initiatives, the layer that groups projects and epics toward a larger outcome.
is_customer_enabled:optionalbooleanEnable customers and customer requests.
is_release_enabled:optionalbooleanEnable releases.
is_state_duration_enabled:optionalbooleanRecord how long work items spend in each state.
is_pi_enabled:optionalbooleanEnable Pi, Plane's AI assistant, in the workspace.
Scopes
workspaces.features:write
Errors
| Status | Code | Cause |
|---|---|---|
400 | validation_error | A flag was sent with a non-boolean value, or work_item_type_default_level was not an integer. Includes an errors[] array naming the field. |
401 | unauthorized | Missing or invalid credentials. |
403 | forbidden | Your role or token scope can't change this workspace's features. |
404 | resource_not_found | No such workspace, or it's outside your tenant. |
409 | conflict | The requested toggle conflicts with the workspace's current state and was not applied. Re-read the object before retrying. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
Unknown keys are not toggles
A body key that is not one of the fields above is not a flag and does not change anything. Always compare the response object against what you sent rather than assuming a 200 means your flag moved; is_workitem_hierarchy_enabled in particular is easy to mistype as is_work_item_hierarchy_enabled.
curl -X PATCH \
"https://api.plane.so/api/v2/workspaces/my-team/features/" \
-H "X-Api-Key: $PLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"is_work_item_types_enabled": true,
"is_state_duration_enabled": true
}'import requests
response = requests.patch(
"https://api.plane.so/api/v2/workspaces/my-team/features/",
headers={"X-Api-Key": "your-api-key"},
json={
"is_work_item_types_enabled": True,
"is_state_duration_enabled": True,
},
)
print(response.json())const response = await fetch("https://api.plane.so/api/v2/workspaces/my-team/features/", {
method: "PATCH",
headers: {
"X-Api-Key": "your-api-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
is_work_item_types_enabled: true,
is_state_duration_enabled: true,
}),
});
const data = await response.json();{
"id": "a72f1c40-5b8e-4d19-9f2a-3c6d8e1b7a55",
"is_work_item_types_enabled": true,
"work_item_type_default_level": 0,
"is_workitem_hierarchy_enabled": false,
"is_project_grouping_enabled": false,
"is_teams_enabled": true,
"is_wiki_enabled": true,
"is_initiative_enabled": false,
"is_customer_enabled": false,
"is_release_enabled": false,
"is_state_duration_enabled": true,
"is_pi_enabled": false,
"created_at": "2026-01-14T09:22:41.478363Z"
}{
"type": "https://api.plane.so/errors/validation_error",
"title": "Validation Error",
"status": 400,
"code": "validation_error",
"detail": "Invalid input.",
"errors": [{ "field": "is_teams_enabled", "message": "Must be a valid boolean." }]
}Confirm the mode after switching it
After a PATCH that changes is_work_item_types_enabled, read the value straight from the response and use it to pick your write surface. Anything you cached before this call is now wrong. Then follow Work item type modes — workspace mode also changes how types reach a project, since projects import workspace types instead of defining their own.

