Categories
The Categories API provides CRUD access to categories, plus ancillary actions for assigning team members to a category and migrating a category’s resources into another category.New to the API? Start with Getting started (base URL, response envelope, errors, pagination) and Authentication (API keys). Those conventions apply to every endpoint below and are not repeated here.
Identifier note: categories are addressed by their numericcategory_id. Wherever{id}appears below it is thecategory_id.
The category object
All endpoints that return a category use this shape:| Field | Type | Notes |
|---|---|---|
id | integer | Category id. Used in all URLs. |
name | string | Category name. |
description | string|null | Category description. |
type | string | Resource type the category belongs to (e.g. project, client, ticket, invoice, …). Set on create, immutable thereafter. |
visibility | string|null | Category visibility. |
icon | string|null | Icon class. |
system_default | string | yes if this is a system-default category (cannot be deleted). |
slug | string | URL slug (auto-generated). |
count | integer | Number of resources of this category’s type currently in the category. |
users_count | integer | Number of team members assigned to the category. |
dates | object | created, updated. |
List / search categories
Query parameters
| Parameter | Type | Description |
|---|---|---|
type | string | Filter by category type. |
visibility | string | Filter by visibility. |
search | string | Free-text search on the category name. |
sort | string | category_name, category_type, category_created. |
order | string | asc or desc (default desc). |
limit | integer | Results per page (max 100). |
page | integer | Page number. |
Example request
Example response — 200 OK
Get a category
Example request
200) with message “Category retrieved successfully.”
Create a category
Body parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
category_name | string | yes | Must be unique within the same category_type. |
category_type | string | yes | Resource type (e.g. project, client, ticket, …). Not changeable later. |
category_visibility | string | no | |
category_description | string | no | |
category_icon | string | no | Icon class. |
Example request
Example response — 201 Created
Update a category
category_name is required and must be unique within the category’s type. category_type
cannot be changed.
Body parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
category_name | string | yes | |
category_visibility | string | no | |
category_description | string | no | |
category_icon | string | no |
Example request
Example response — 200 OK
Delete a category
count is 0) and is not a
system-default category. Otherwise a 409 is returned. To empty a non-empty category first,
use the migrate action below. Deleting also removes the category’s team assignments.
Example request
Example response — 200 OK
Set team members
users array is the full set — it
replaces any existing assignment; an empty array clears all. Category-based project permissions
are re-synced automatically.
| Parameter | Type | Required | Notes |
|---|---|---|---|
users | array of integers | yes | Team user ids. Empty array clears all. |
200) with message “Category team updated successfully.”
Migrate resources
| Parameter | Type | Required | Notes |
|---|---|---|---|
target_id | integer | yes | Destination category id. Must exist and differ from {id}. |
200) with message “Category resources migrated successfully.”
Errors
See Getting started for the shared error format. Category-specific:| Status | Meaning |
|---|---|
404 Not Found | The category id does not exist. |
409 Conflict | Cannot delete a system-default or non-empty category. |
422 Unprocessable Entity | Validation failed (e.g. missing name/type, or a duplicate name within the type). |