Workspace type properties overview
A workspace work item type decides which custom properties appear on the work items that use it. This resource is the link between the two: it lists the properties currently on a type, and it attaches and detaches them.
/api/v2/workspaces/{slug}/work-item-types/{type_id}/properties/The properties themselves are not created here. They live in the workspace property catalog at /work-item-properties/, and one property can be attached to as many types as you like. That is the point of the split: define Severity once for the workspace, then put it on Bug, Incident, and Escalation.
Because the catalog is shared, detaching never deletes. DELETE on this route removes the property from the type and leaves the property itself — and every other type that uses it — untouched. To remove a property from the workspace entirely, use Delete a workspace property.
Writes here require workspace mode
A workspace manages work item types in exactly one mode: project-level or workspace-level. Attaching or detaching on this route while the workspace is in project mode returns 409 with the code work_item_types_managed_at_project — the capability exists, it just lives on the project surface. Reads are unaffected by mode. See Work item type modes.
The property object
Reads on this resource return the full property object, the same shape the workspace property catalog returns. Every field is read-only here — this route only changes which properties a type carries, never what a property is.
Attributes
idstring (uuid)Unique identifier for the property. This is the id you send in
propertiesto attach it, and thepkyou use to detach it.namestringRead-only companion to
display_name. You never set it directly.display_namestringThe label shown wherever the property is rendered.
descriptionstringFree-form explanation of what the property captures. May be
null.property_typestringWhat kind of value the property holds. One of
TEXT,DATETIME,DECIMAL,BOOLEAN,OPTION,RELATION,URL,EMAIL,FILE, orFORMULA.relation_typestringFor a
RELATIONproperty, what it points at — one ofISSUE,USER,RELEASE, orRICH_TEXT.nullfor every other property type.is_requiredbooleanWhether a value must be supplied for this property.
is_multibooleanWhether the property accepts more than one value.
is_activebooleanWhether the property is in use. A property can be retired by setting this to
falseon the catalog resource, without deleting it.default_valuearray of stringThe value applied when none is supplied. Always an array, even when
is_multiisfalse.optionsarray of anyThe choices for an
OPTIONproperty. Manage them through Property options.settingsanyType-specific configuration. Its shape depends on
property_type.validation_rulesanyType-specific validation configuration.
logo_propsanyPresentation data for the property's icon.
external_id,external_sourcestringCorrelation fields for sync and import. Together they let you map a property to a record in another system and find it again later. Either may be
null.created_atstring (date-time)When the property was created.
There is no separate link object
The response is the property, not a join record. If you need to know whether a given property is on a type, GET …/properties/{pk}/ — a 404 means it is not attached, and a 200 means it is.
{
"id": "a7e3f1d0-5c92-4b68-8f31-2d4a6b9e0c15",
"name": "severity",
"display_name": "Severity",
"description": "How badly the customer is affected",
"property_type": "OPTION",
"relation_type": null,
"is_required": true,
"is_multi": false,
"is_active": true,
"default_value": ["Major"],
"options": [
{
"id": "9d2c7b41-6a80-4f35-8e19-5c3b0a7d2e46",
"name": "Critical",
"description": "Production is down",
"is_default": false,
"sort_order": 10000,
"external_id": null,
"external_source": null
},
{
"id": "5a83e0b7-2c46-4d19-9f70-6b12c8e5a03d",
"name": "Major",
"description": "A core workflow is broken",
"is_default": true,
"sort_order": 20000,
"external_id": null,
"external_source": null
}
],
"settings": {},
"validation_rules": {},
"logo_props": {},
"external_id": null,
"external_source": null,
"created_at": "2026-01-14T09:22:41.478363Z"
}Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/workspaces/{slug}/work-item-types/{type_id}/properties/ | List the properties on a type |
POST | /api/v2/workspaces/{slug}/work-item-types/{type_id}/properties/ | Attach existing properties |
GET | /api/v2/workspaces/{slug}/work-item-types/{type_id}/properties/{pk}/ | Get one property on a type |
DELETE | /api/v2/workspaces/{slug}/work-item-types/{type_id}/properties/{pk}/ | Detach a property from the type |
There is no POST that creates a property here and no PATCH that edits one. Attaching takes ids of properties that already exist, and editing a property is done on the catalog resource.
Attaching properties
POST takes a single field, properties, holding the ids of properties to attach:
{ "properties": ["a7e3f1d0-5c92-4b68-8f31-2d4a6b9e0c15", "3fb6c0d8-4e21-49a7-b5c3-90ad72e14f6b"] }The response echoes the ids that are now on the type. An id that does not exist in this workspace is rejected with 400 validation_error — a cross-tenant id is never silently ignored.
Where a property applies
Attaching a property to a type is a statement about the type, which lives at the workspace level. When you need narrower scoping — this property on these projects only, or across a chosen set of types — model it with Property contexts instead.

