Attach properties to a workspace type
Attach one or more existing workspace properties to a workspace-level work item type. This does not create properties — create those first with Create a workspace property, then send their ids here.
Because the same property can be attached to many types, this is how you reuse one Severity definition across Bug, Incident, and Escalation instead of maintaining three near-identical fields.
Wrong mode is a 409, not a 404
If the workspace manages work item types at the project level, this route returns 409 with the code work_item_types_managed_at_project. Attach through the project-level route instead. See Work item type modes.
Path Parameters
slug:requiredstringThe workspace slug. It appears in your Plane URLs — in https://app.plane.so/my-team/projects/, the slug is my-team.
type_id:requiredstring (uuid)The workspace work item type to attach the properties to.
Body Parameters
properties:requiredarray of string (uuid)Ids of properties to attach, taken from the workspace property catalog. Send the whole set you want in one call rather than one request per property.
Every id must already exist in this workspace. An unknown id — including one that belongs to another workspace — fails the request with 400 validation_error; nothing is attached, and a cross-tenant id is never silently linked.
Scopes
workspaces.work_item_types:write
Errors
| Status | Code | Cause |
|---|---|---|
400 | validation_error | properties missing, not an array, or holding an id that doesn't exist here. |
401 | unauthorized | Missing or invalid credentials. |
403 | forbidden | Your role or token scope can't write workspace work item types. |
404 | resource_not_found | No such workspace or type, or it's outside your tenant. |
409 | work_item_types_managed_at_project | This workspace manages work item types at the project level. |
429 | rate_limited | Throttled. Honor the Retry-After header before retrying. |
curl -X POST \
"https://api.plane.so/api/v2/workspaces/my-team/work-item-types/d1a0b7c6-2f83-4e19-9a55-3b6c8d0e4f27/properties/" \
-H "X-Api-Key: $PLANE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"properties": [
"a7e3f1d0-5c92-4b68-8f31-2d4a6b9e0c15",
"3fb6c0d8-4e21-49a7-b5c3-90ad72e14f6b"
]
}'import requests
response = requests.post(
"https://api.plane.so/api/v2/workspaces/my-team/work-item-types/d1a0b7c6-2f83-4e19-9a55-3b6c8d0e4f27/properties/",
headers={"X-Api-Key": "your-api-key"},
json={
"properties": [
"a7e3f1d0-5c92-4b68-8f31-2d4a6b9e0c15",
"3fb6c0d8-4e21-49a7-b5c3-90ad72e14f6b",
]
},
)
print(response.json())const response = await fetch(
"https://api.plane.so/api/v2/workspaces/my-team/work-item-types/d1a0b7c6-2f83-4e19-9a55-3b6c8d0e4f27/properties/",
{
method: "POST",
headers: {
"X-Api-Key": "your-api-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
properties: ["a7e3f1d0-5c92-4b68-8f31-2d4a6b9e0c15", "3fb6c0d8-4e21-49a7-b5c3-90ad72e14f6b"],
}),
}
);
const data = await response.json();{
"properties": ["a7e3f1d0-5c92-4b68-8f31-2d4a6b9e0c15", "3fb6c0d8-4e21-49a7-b5c3-90ad72e14f6b"]
}{
"type": "https://api.plane.so/errors/work-item-types-managed-at-project",
"title": "Conflict",
"status": 409,
"code": "work_item_types_managed_at_project",
"detail": "This workspace manages work item types at the project level. Use the project-level endpoint instead."
}The response is ids, not objects
201 returns only the properties array. To render the attached properties, follow with List properties on a workspace type or fetch them individually.

