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.
Plane doesn't validate a changed type. It saves a value other than transition or approval as the state's type, returns 200, and still deletes the transitions and approvers.
Response shaping
fields:optionalstringComma-separated list of fields to return. Fields you don't request are left out of the response instead of coming back as null, so a missing key means you didn't ask for it and null means the value is null. id is always included, whether or not you name it.
Pass all to get every requestable field. An unknown field name returns 400 with the list of valid names and the closest match, so a typo is caught instead of being silently ignored.
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 | The Workflows feature isn't on your plan, or is turned off. |
402 | payment_required | type is approval, and the Workflow approvals feature isn't on your plan or is turned off. |
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."
}
