Skip to content

Attach a property to a type ​

POST/api/v2/workspaces/{slug}/projects/{project_id}/work-item-types/{type_id}/properties/

Expose one or more existing custom properties on a work item type. After this call, work items of that type collect those properties.

This does not create a property

The body is a list of ids of properties that already exist in the project. Sending a definition (display_name, property_type, and so on) returns 400. Create the property first with Create a work item property, then attach the id it returns.

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 work item type belongs to.

type_id:requiredstring (uuid)

The work item type to attach the properties to.

Body parameters ​

properties:requiredarray of string (uuid)

The ids of the properties to attach. Every id must belong to a property in this project. An id from another project or another workspace fails the whole request with 400 invalid_request, and nothing is attached. Either all the ids are valid and applied, or none are.

The array cannot be empty. Attaching an id the type already exposes is not an error and does not create a duplicate, so retrying a request that may have already succeeded is safe.

Scopes ​

projects.work_item_types:write

Errors ​

StatusCodeCause
400invalid_requestproperties missing or empty, or an id that isn't a property 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 edit this project's work item types.
404not_foundNo such workspace, project, or type, or it's outside your tenant.
406not_acceptableThe Accept header asks for a representation the API can't produce.
409conflictThis workspace manages work item types at the workspace level. See below.
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.

Wrong mode returns 409, not 404

Attaching is a project-mode write. If the workspace manages work item types at the workspace level, this endpoint returns 409 work_item_types_managed_at_workspace, because the operation exists on the other surface. Attach there instead with Attach a property to a workspace type.

Branch on the code, not the status: a 409 here means "wrong surface", never "already attached". See Work item type modes.

Attach properties to a type
bash
curl -X POST \
  "https://api.plane.so/api/v2/workspaces/my-team/projects/4af68566-94a4-4eb3-94aa-50dc9427067b/work-item-types/9d3c7f21-6b48-4e0a-8f52-2c1d7a904e66/properties/" \
  -H "X-Api-Key: $PLANE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "properties": [
    "c1f0a2d4-73b9-4e6c-8a15-9d0e4b3f7c28",
    "5e8b3417-2a6d-4c91-b0f7-8d2e14a6c395"
  ]
}'
Response201
json
{
  "properties": ["c1f0a2d4-73b9-4e6c-8a15-9d0e4b3f7c28", "5e8b3417-2a6d-4c91-b0f7-8d2e14a6c395"]
}
Response400
json
{
  "type": "invalid_request",
  "code": "invalid_request",
  "detail": "One or more fields failed validation.",
  "errors": [
    {
      "field": "properties",
      "code": "invalid",
      "message": "This list may not be empty."
    }
  ]
}
Response409
json
{
  "type": "conflict",
  "code": "work_item_types_managed_at_workspace",
  "detail": "Work item types are managed at the workspace level for this workspace."
}

The response is ids, not objects

201 returns a properties array with the ids that are now attached to the type. It does not echo the property definitions. Read them back with List type properties or Get a type property when you need display_name, property_type, or the option list.