Skip to content

Update a label

PATCH/api/v2/workspaces/{slug}/projects/{project_id}/labels/{pk}/

Change a label's name, color, description, nesting, or ordering. Every work item already carrying the label picks up the change — the label id does not move, so no work item loses its tag when you rename it.

The update is partial. Fields you omit are left untouched, and omitting a field is not the same as sending null: send "parent_id": null to lift a nested label to the top level.

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 label belongs to.

pk:requiredstring (uuid)

The label id.

Body Parameters

name:optionalstring

New display name, unique within the project. Maximum 255 characters. Renaming onto a name another label already holds returns 409 conflict.

color:optionalstring

Hex color used wherever the label is rendered, for example #e5484d. Maximum 255 characters.

description:optionalstring

Free-form note about what the label is for.

parent_id:optionalstring (uuid)

Move the label under a different parent. The new parent must be a label in the same project. Send null to make the label top-level again.

sort_order:optionalnumber

Ordering weight within the project. Lower values sort first.

external_id:optionalstring

Your system's identifier for this label, for sync and import correlation. Maximum 255 characters. Send null to clear it.

external_source:optionalstring

The system external_id came from, for example github or jira. Maximum 255 characters. Send null to clear it.

Scopes

projects.labels:write

Errors

StatusCodeCause
400validation_errorA field over its length limit, or a parent_id that isn't a label in this project.
401unauthorizedMissing or invalid credentials.
403forbiddenYour role or token scope can't update labels.
404resource_not_foundNo such label in this project, or the workspace or project is outside your tenant.
409conflictAnother label in the project already uses the name you sent.
429rate_limitedThrottled. Honor the Retry-After header before retrying.

There is no PUT

PUT on this path returns 405 method_not_allowed. Send only the fields you want to change with PATCH — a full-object write is never required, and rebuilding the object client-side risks clobbering a field someone else just changed.

Update a label
bash
curl -X PATCH \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/labels/9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88/" \
  -H "X-Api-Key: $PLANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Regression - blocking",
  "color": "#c62828"
}'
Response200
json
{
  "id": "9c1f0b3d-6d2e-4c9a-8b41-2f7e5a0d6c88",
  "name": "Regression - blocking",
  "description": "Worked before the last release",
  "color": "#c62828",
  "sort_order": 65535,
  "parent_id": "2b7d5e94-3c1a-4f60-9a8d-7e1c4b0f2d35",
  "external_id": null,
  "external_source": null,
  "created_at": "2026-01-14T09:22:41.478363Z",
  "created_by_id": "16c61a3a-512a-48ac-b0be-b6b46fe6f430"
}
Response409
json
{
  "type": "https://api.plane.so/errors/conflict",
  "title": "Conflict",
  "status": 409,
  "code": "conflict",
  "detail": "A label with this name already exists in the project."
}