Skip to content

Create a project state ​

POST/api/v2/workspaces/{slug}/project-states/

Add a stage to the workspace's project state catalog. Any project in the workspace can then move to it through its state_id.

The new state is never the default, even if you send is_default. To make it the default, call Mark a project state as default.

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.

Body Parameters ​

name:requiredstring

Display name, unique in the workspace. Maximum 50 characters. A name already in use returns 409 conflict. The comparison is case-sensitive, so Discovery and discovery can both exist.

color:requiredstring

Hex color used wherever the project state is rendered, for example #F59E0B. Maximum 255 characters.

group:optionalstring

The lifecycle group. Defaults to draft.

  • draft
  • planning
  • execution
  • monitoring
  • completed
  • cancelled

Work item state groups such as started are not accepted and return 400 invalid_request.

description:optionalstring

Free-form description of what the stage means.

sequence:optionalnumber

Ordering weight. Lower values sort first. Plane places a new project state after the last one and uses your value only when the workspace has no project states. To reposition a state, send sequence in Update a project state.

external_id:optionalstring

Your system's identifier for this project state. Maximum 255 characters.

external_source:optionalstring

The system external_id came from. Maximum 255 characters.

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, name, sequence, updated_at, updated_by_id.

See Sparse fields.

Scopes ​

workspaces.project_states:write

Errors ​

StatusCodeCause
400invalid_requestMissing name or color, a group outside the six lifecycle groups, or a name over 50 characters.
401unauthorizedMissing or invalid credentials.
402payment_requiredProject states aren't included in the workspace's plan, or are turned off in its settings.
403forbiddenYour role or token scope can't create project states.
404not_foundNo such workspace, or it's outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
409conflictA project state with this name already exists in the workspace.
409governance_migration_in_progressA governance migration is running, so the workspace is read-only. Retry after it finishes.
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.
Create a project state
bash
curl -X POST \
  "https://api.plane.so/api/v2/workspaces/my-team/project-states/" \
  -H "X-Api-Key: $PLANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Discovery",
  "color": "#3E63DD",
  "group": "planning",
  "description": "Scoping and research before a plan is agreed"
}'
Response201
json
{
  "id": "6f0c3a85-9b2e-4d17-a8f6-3e5b1c7d9a42",
  "name": "Discovery",
  "description": "Scoping and research before a plan is agreed",
  "color": "#3E63DD",
  "group": "planning",
  "sequence": 80000,
  "is_default": false,
  "external_id": null,
  "external_source": null,
  "created_at": "2026-02-03T16:45:12.904117Z",
  "updated_at": "2026-02-03T16:45:12.904117Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430",
  "updated_by_id": null
}
Response409
json
{
  "type": "conflict",
  "code": "conflict",
  "detail": "A project state with this name already exists in this workspace."
}