Delete a state
Remove a state from a project's workflow. A successful delete returns 204 with an empty body.
Two conditions block a delete, and you have to clear the condition before the state will go — see Before you delete.
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.
project_id:requiredstring (uuid)The project the state belongs to.
pk:requiredstring (uuid)The id of the state to delete.
Scopes
projects.states:write
Errors
| Status | Code | Cause |
|---|---|---|
401 | unauthorized | Missing or invalid credentials. |
403 | forbidden | Your role or token scope can't delete states. |
404 | resource_not_found | No such state, project, or workspace — or it's outside your tenant. |
409 | conflict | This is the project's default state. |
409 | conflict | The state still holds work items. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X DELETE \
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/states/f960d3c2-8524-4a41-b8eb-055ce4be2a7f/" \
-H "X-Api-Key: $PLANE_API_KEY"import requests
response = requests.delete(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/states/f960d3c2-8524-4a41-b8eb-055ce4be2a7f/",
headers={"X-Api-Key": "your-api-key"},
)
print(response.status_code)const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/states/f960d3c2-8524-4a41-b8eb-055ce4be2a7f/",
{
method: "DELETE",
headers: {
"X-Api-Key": "your-api-key",
},
}
);
console.log(response.status);No response body.
{
"type": "https://api.plane.so/errors/conflict",
"title": "Conflict",
"status": 409,
"code": "conflict",
"detail": "The default state cannot be deleted."
}{
"type": "https://api.plane.so/errors/conflict",
"title": "Conflict",
"status": 409,
"code": "conflict",
"detail": "This state still has work items in it."
}Before you delete
Both protected cases return 409 conflict, so branch on the detail only for messaging — the fix differs:
- The project's default state. Every project needs somewhere for work items to land when no
state_idis supplied. Promote another state with Update a state and"is_default": true, which demotes the current default, then delete it. - A state that still holds work items. Deleting it would leave those work items without a status. Move them to another state first — filter the project's work items by this state,
PATCHeach one to the replacement state, then retry the delete.
A safe teardown is therefore: reassign work items, hand off the default flag if this state has it, delete.
Deletes are soft
The state stops appearing in the API and in Plane, but the row is retained. Treat the 204 as final for integration purposes — the states API has no restore operation.

