Skip to content

Create a workspace work item type ​

POST/api/v2/workspaces/{slug}/work-item-types/

Define a work item type for the whole workspace. The type becomes available to projects working from the workspace list, so one call gives every team the same Bug or Incident rather than each project inventing its own.

Workspace mode required

This write only succeeds while the workspace manages work item types at the workspace level. In project mode it returns 409 with code work_item_types_managed_at_project — create the type on the project endpoint instead. See Work item type modes.

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 for the type, for example Incident. Maximum 255 characters. Reusing a name that already exists in the workspace, ignoring case, returns 400.

description:optionalstring

What this type is for. It is shown next to the type wherever someone picks it, so write it for the person choosing.

is_active:optionalboolean

Whether the type can be selected. Send false to create a type that exists but stays out of pickers until you are ready to roll it out.

external_id:optionalstring

Your system's identifier for this type, for sync and import correlation. Maximum 255 characters, and accepts null. Reads return it, and you can filter List workspace work item types by it.

external_source:optionalstring

The system external_id came from, for example jira. Maximum 255 characters, and accepts null. An external_id is unique only within its source, so send both.

is_default, is_epic, level, and logo_props are read-only. A type created here is a standard work item type; promote it to the workspace default with Mark a type as default.

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: created_at, description, external_id, external_source, governance_mode, id, is_active, is_active_in_project, is_default, is_default_in_project, is_epic, level, logo_props, name, project_ids, rollout, updated_at, updated_by_id.

See Sparse fields.

Scopes ​

workspaces.work_item_types:write

Errors ​

StatusCodeCause
400invalid_requestname is missing, empty, or longer than 255 characters. See errors[].
400invalid_requestAnother workspace type already uses this name, ignoring case.
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 write workspace types.
404not_foundNo such workspace, or it's outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
409conflictAnother workspace type already uses this external_id and external_source pair. The response id names it.
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 workspace work item type
bash
curl -X POST \
  "https://api.plane.so/api/v2/workspaces/my-team/work-item-types/" \
  -H "X-Api-Key: $PLANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Incident",
  "description": "Customer-facing outage that needs a response now",
  "is_active": true,
  "external_id": "10004",
  "external_source": "jira"
}'
Response201
json
{
  "id": "a3f52d07-8e19-4c6b-92d4-0b7e15c8f326",
  "name": "Incident",
  "description": "Customer-facing outage that needs a response now",
  "logo_props": {},
  "is_epic": false,
  "is_default": false,
  "is_active": true,
  "level": 0,
  "governance_mode": "any",
  "rollout": "none",
  "project_ids": [],
  "external_id": "10004",
  "external_source": "jira",
  "created_at": "2026-01-14T09:22:41.478363Z",
  "updated_at": "2026-01-14T09:22:41.478363Z",
  "updated_by_id": null
}
Response409
json
{
  "type": "conflict",
  "code": "work_item_types_managed_at_project",
  "detail": "This workspace manages work item types at the project level. Create the type on the project's work item types endpoint."
}

Next steps

A new type starts with no custom properties. Attach the properties it should collect, then bring it into the projects that need it with Import work item types, passing the id returned above.