Skip to content

Delete a state ​

DELETE/api/v2/workspaces/{slug}/projects/{project_id}/states/{pk}/

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:requiredstring

The 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.

Response shaping ​

fields:optionalstring

Comma-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: color, created_at, created_by_id, description, external_id, external_source, group, id, is_default, is_triage, name, sequence.

See Sparse fields.

Scopes ​

projects.states:write

Errors ​

StatusCodeCause
400invalid_requestThe request body or a query parameter failed validation.
401unauthorizedMissing or invalid credentials.
402payment_requiredThe feature this endpoint belongs to isn't enabled on your plan, or is switched off.
403forbiddenYour role or token scope can't delete states.
404not_foundNo such state, project, or workspace — or it's outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
409conflictThe state still holds work items.
413payload_too_largeThe request body is over the size limit.
415unsupported_media_typeThe Content-Type isn't one this endpoint accepts.
429rate_limitedThrottled. Honor the Retry-After header before retrying.
Delete a state
bash
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"
Response204

No response body.

Response409
json
{
  "type": "conflict",
  "code": "conflict",
  "detail": "The default state cannot be deleted."
}
Response409
json
{
  "type": "conflict",
  "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_id is 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, PATCH each 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.