Get distinct item types with counts
Returns each distinct item type with how many items carry it. A bare array, not the list envelope. The count is over ACTIVE items only (WHERE active = true), so it does not match the totals from GET /v1/items unless that list is filtered the same way. This route performs no record-permission check and takes no query parameters.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/items/types/distinct"[
{
"type": "product",
"count": 12
}
]{
"status": 409,
"message": "Item with this name already exists",
"code": "items_m.item_name_exists",
"class": "business",
"retryable": false,
"details": [
{
"field": "title",
"rule": "required",
"param": "string",
"message": "title is required"
}
]
}{
"status": 409,
"message": "Item with this name already exists",
"code": "items_m.item_name_exists",
"class": "business",
"retryable": false,
"details": [
{
"field": "title",
"rule": "required",
"param": "string",
"message": "title is required"
}
]
}{
"status": 429,
"message": "rate limit exceeded",
"code": "rate_limits_m.exceeded",
"class": "temporary",
"retryable": true
}{
"status": 409,
"message": "Item with this name already exists",
"code": "items_m.item_name_exists",
"class": "business",
"retryable": false,
"details": [
{
"field": "title",
"rule": "required",
"param": "string",
"message": "title is required"
}
]
}{
"overall_status": "unhealthy",
"message": "Service is shutting down",
"timestamp": "2026-08-27T15:04:05Z"
}Returns one item, with title_loc/description_loc resolved from Accept-Language. A caller without the read permission on items is refused with 403 `common.rbac_no_rec_access`.
Updates the fields present in the body; absent fields are left alone. A caller without the update permission on items is refused with 403 `common.rbac_no_rec_access`. system is writable here. Sending "system": false on an item that had it set clears the delete protection described on DELETE /v1/items/{id}; the field is only skipped when the key is absent from the body.