Data Structure
# DAQS Assist JSON — data structure and mental model
DAQS rules do not query Revit directly.
They query the **JSON file generated by DAQS Assist**.
This page explains how that JSON is structured, how relationships are represented, and how to reason about the data before writing or modifying rules.
---
## Why this matters
Every DAQS rule operates on the same input: a single JSON dataset exported by DAQS Assist.
If you do not understand where information lives in this JSON, your rule will:
- return no results
- return incorrect results
- or fail silently
Understanding the data structure turns rule writing into a **data filtering exercise**, instead of trial-and-error.
---
## Mental model
Think of the DAQS Assist JSON as:
> **A flat list of Revit-related objects, each with a `type`, an `id`, a `values` object, and optionally a `parent`.**
There is **no hierarchy** like in Revit itself.
All relationships are expressed explicitly through:
- object IDs
- `parent` references
- references stored inside `values`
Most DAQS rules follow this pattern:
1. Filter objects by `type`
2. Narrow down based on data inside `values`
3. Optionally resolve relationships (symbol, level, parameter, material)
---
## Global structure
The DAQS Assist output is a **single JSON array**:
```json
[
{ "id": 544322, "type": "CadFile", ... },
{ "id": 617348, "type": "Family", ... },
{ "id": 617464, "type": "FamilySymbol", ... },
{ "id": 616521, "type": "FamilyInstance", ... }
]
Key characteristics:
- There is no root object
- Every element is a peer in the same array
- Every rule starts by filtering this array
This is why almost all JSONata queries begin with:
$[type = "..."]
Core object fields
Every object in the DAQS Assist JSON follows the same basic structure.
type — object classification
The type field identifies what kind of object this is.
Example:
{
"id": 616521,
"type": "FamilyInstance",
"values": { ... }
}
Typical rule entry point:
$[type = "FamilyInstance"]
You should always start a rule with an explicit type filter.
id — object identity
Each object has a unique numeric id.
IDs are used to:
- link instances to symbols
- link elements to levels
- link parameters to their definitions
- express parent–child relationships
Example:
{
"id": 616521,
"type": "FamilyInstance",
"parent": {
"id": 617464,
"type": "FamilySymbol"
}
}
This tells you:
- Instance 616521
- Is of FamilySymbol 617464
parent — relationships
Some objects include a parent field.
Common relationships:
FamilySymbol→ parentFamilyFamilyInstance→ parentFamilySymbolLinkInstance→ parentLinkType
Example:
"parent": {
"id": 617464,
"type": "FamilySymbol"
}
This allows rules to:
- find all instances of a given family
- read symbol-level data while validating instances
- traverse relationships explicitly
values — where the data lives
Almost all data you validate lives inside the values object.
Example (FamilyInstance):
"values": {
"levelId": 311,
"mark": "61",
"exportedToIfc": "By Type",
"ifcGuid": "2ziTjLSbz5HulRPb7oPoRS"
}
Typical validations:
- read values from
values - check presence or absence
- compare against allowed values
Key object types
These are the most commonly used object types exposed by DAQS Assist (this list is not exhaustive):
| Type | JSONata filter |
|---|---|
| CadFile | $[type = "CadFile"] |
| Family | $[type = "Family"] |
| FamilySymbol | $[type = "FamilySymbol"] |
| FamilyInstance | $[type = "FamilyInstance"] |
| Parameter | $[type = "Parameter"] |
| Level | $[type = "Level"] |
| Material | $[type = "Material"] |
| Room | $[type = "Room"] |
| Space | $[type = "Space"] |
| LinkType | $[type = "LinkType"] |
| LinkInstance | $[type = "LinkInstance"] |
| MechanicalSystem | $[type = "MechanicalSystem"] |
| PipingSystem | $[type = "PipingSystem"] |
| Grid | $[type = "Grid"] |
| Workset | $[type = "Workset"] |
| View | $[type = "View"] |
Most validation rules focus on:
FamilySymbolFamilyInstanceRoomMaterial
Parameters in the JSON (important)
Shared and project parameters appear inside values using a consistent pattern.
Example:
"p_8fe8f5ce-4979-4679-b5e0-ccfb362b9059": {
"id": 317596,
"value": "30",
"hasValue": true,
"ref": "Parameter",
"valueAsString": "30"
}
Key rules:
- Parameter keys always start with
p_ - The suffix is the parameter GUID
idrefers to an object oftype = "Parameter"
The parameter definition itself appears elsewhere in the JSON:
{
"id": 317596,
"type": "Parameter",
"values": {
"guid": "8fe8f5ce-4979-4679-b5e0-ccfb362b9059",
"name": "NLRS_C_brandwerendheid"
}
}
This separation allows rules to independently validate:
- parameter existence
- parameter values
- correct parameter usage context
Spatial context: levels, rooms, and spaces
Many objects reference a level using levelId:
"levelId": 311
Which corresponds to:
{
"id": 311,
"type": "Level",
"values": {
"name": "00 begane grond",
"isBuildingStory": true
}
}
Rooms and Spaces additionally expose:
- area
- volume
- boundary data
- level information
This enables rules such as:
- “Only validate elements on building-story levels”
- “Rooms must contain parameter X”
How to explore the JSON effectively
When writing or debugging a rule:
- Start by filtering on
type - Inspect one real object
-
Identify:
-
relevant fields inside
values - parameter GUIDs
- parent relationships
- Write the smallest possible JSONata filter
- Expand only when necessary
If you do not know where a value lives, inspect the JSON first.
Key takeaway
If you understand the DAQS Assist JSON, writing DAQS rules becomes a data filtering problem, not guesswork.