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.

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, id, name, parent_id, sort_order.

See Sparse fields.

Scopes ​

projects.labels:write

Errors ​

StatusCodeCause
400invalid_requestA field over its length limit, or a parent_id that isn't a label in this project.
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 update labels.
404not_foundNo such label in this project, or the workspace or project is outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
409conflictAnother label in the project already uses the name you sent.
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.

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": "conflict",
  "code": "conflict",
  "detail": "A label with this name already exists in the project."
}