Update a workspace workflow state
Change a chain entry's type or allow_issue_creation. These are the only two settings this endpoint writes. To change a state's position, send a states body to Update a workspace workflow. To change the default, use Mark a workspace workflow state as default.
PATCH is partial. Send only the field you want to change.
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.
workflow_id:requiredstring (uuid)The catalog workflow whose chain you are working with.
state_id:requiredstring (uuid)The catalog state id, not the chain entry's own id. A state that isn't in this workflow's chain returns 404.
Body Parameters
type:optionalstringHow work items leave the state.
transition: work items move along the state's transitions directly.approval: a move out of the state needs a decision from the transition's approvers. Approval moves the work item to the transition's target, and rejection moves it to the transition's rejection state.
Setting approval needs the Workflow approvals plan feature, or the request returns 402.
allow_issue_creation:optionalbooleanWhether new work items can be created directly in this state.
Changing type deletes the state's outgoing transitions
Switching a state between transition and approval deletes every transition that starts from the state, with their approvers, because they were set up for the old type. Recreate them with Create a workspace workflow transition. A request that changes type applies only the type, so send allow_issue_creation in a separate request.
Response shaping
fields:optionalstringComma-separated list of fields to return. Unrequested keys are omitted from the response, not returned as null, so absent means "not requested" and null means "actually null". id always comes back whether or not you name it.
Pass all for every requestable field. An unknown name is a 400 that lists the valid set and suggests the closest match, so a typo can't silently cost you the saving.
Requestable here: allow_issue_creation, id, is_default, sequence, state_id, type, updated_at, workflow_id.
See Sparse fields.
Scopes
workspaces.workflows:write
Errors
| Status | Code | Cause |
|---|---|---|
400 | invalid_request | A field failed validation, for example a non-boolean allow_issue_creation. |
401 | unauthorized | Missing or invalid credentials. |
402 | payment_required | Workflows isn't on your plan, or type is approval and Workflow approvals isn't on your plan. |
403 | forbidden | Your role or token scope can't edit workspace workflows. |
404 | not_found | No such workflow in this workspace's catalog, or the state isn't in its chain. |
406 | not_acceptable | The Accept header asks for a representation the API can't produce. |
409 | governance_migration_in_progress | A governance migration is running in this workspace, so writes are paused. Retry after it finishes. |
409 | states_managed_at_project | The workspace doesn't have governance turned on. Use the project's workflows instead. |
413 | payload_too_large | The request body is over the size limit. |
415 | unsupported_media_type | The Content-Type isn't one this endpoint accepts. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X PATCH \
"https://api.plane.so/api/v2/workspaces/my-team/workflows/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/states/f960d3c2-8524-4a41-b8eb-055ce4be2a7f/" \
-H "X-Api-Key: $PLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"allow_issue_creation": false
}'import requests
response = requests.patch(
"https://api.plane.so/api/v2/workspaces/my-team/workflows/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/states/f960d3c2-8524-4a41-b8eb-055ce4be2a7f/",
headers={"X-Api-Key": "your-api-key"},
json={
"allow_issue_creation": False,
},
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/workflows/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/states/f960d3c2-8524-4a41-b8eb-055ce4be2a7f/",
{
method: "PATCH",
headers: {
"X-Api-Key": "your-api-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
allow_issue_creation: false,
}),
},
);
const data = await response.json();{
"id": "0e6b4d82-1c9a-4f53-b7e2-9a3d5f8c6e10",
"state_id": "f960d3c2-8524-4a41-b8eb-055ce4be2a7f",
"workflow_id": "9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88",
"type": "transition",
"is_default": false,
"allow_issue_creation": false,
"sequence": 20000.0,
"updated_at": "2026-02-03T16:45:12.904117Z"
}{
"type": "payment_required",
"code": "payment_required",
"detail": "Workflow approvals are not enabled for this workspace."
}
