category.type
The category field on a FamilySymbol contains three subfields:
"category": {
"name": "Doors",
"label": "OST_Doors",
"type": "Model"
}
category.type is Revit's internal category classification. It tells you what kind of category something belongs to — not which specific category, but what role that category plays in Revit.
The possible values
| Value | Revit name | What it contains |
|---|---|---|
"Model" |
Model | 3D elements placed in the model — doors, walls, beams, equipment |
"Annotation" |
Annotation | 2D view-specific content — tags, dimensions, text notes, detail items |
"Internal" |
Internal | Revit-internal categories — model groups, reference planes |
"Invalid" |
Invalid | Categories Revit cannot classify |
In practice, DAQS rules almost exclusively work with "Model".
Why it matters in filters
A Revit model contains a large number of FamilySymbol objects across all category types. Without filtering on category.type, your query includes annotation families, detail component families, and internal categories — most of which are irrelevant to data quality rules.
Filtering to "Model" restricts the scope to loadable families that produce physical 3D elements:
$[type = "FamilySymbol" and values.category.type = "Model"]
This is often the first condition in production filters because it removes a large portion of irrelevant objects in one step.
Typical combined filter
In real rules, category.type is combined with a category inclusion or exclusion list:
(
$CategoryExclusion := ["OST_DetailComponents"];
$symbols := $[
type = "FamilySymbol"
and values.category.type = "Model"
and $not(values.category.label in $CategoryExclusion)
];
$[type = "FamilyInstance" and parent.id in $symbols.id].{
"id": id,
"name": name,
"mark": values.mark
}
)
The category.type = "Model" condition runs first as a broad scope filter. The label-based exclusion list then removes specific unwanted categories within that scope.
Relation to the other category fields
| Field | Example | Use for |
|---|---|---|
category.type |
"Model" |
Broad scope — include/exclude entire category classes |
category.label |
"OST_Doors" |
Specific filtering — target one or more named categories |
category.name |
"Doors" |
Display only — do not use in filter conditions |
Use category.type for the broad first pass. Use category.label for the specific category conditions that follow.