weScan JSON Schema — Nijbegun Isolatieplan
This document describes the JSON format exported by weScan and imported into the Nijbegun insulation plan intake form.
Purpose
Once an advisor has created a customer and a building (with its rekenzone) in Nij Begun, they can upload a JSON file exported from weScan. This automatically fills in building elements, dimensions, and orientations in the intake form — removing the need to enter this data twice.
The import covers building geometry. Insulation values and installations still need to be filled in manually by the advisor. Adjacency defaults to outside air and should be verified per element.
Top-Level Fields
All top-level fields are optional. When present, they are applied to the existing building object/zone.
| Field | Type | Unit | Description |
|---|---|---|---|
building_year | string | — | Construction year, e.g. "1978" |
building_height | string | m | Total building height, e.g. "6.2" |
building_layers | array of strings | m² | Gebruiksoppervlak per bouwlaag (floor area per storey), e.g. ["48.0", "44.0"] |
childrenGroups | array | — | Either building elements (single-zone) or zone entries (multi-zone) — see Rekenzones |
All numeric values must be strings, e.g.
"28.0"not28.0.
Rekenzones
The top-level childrenGroups supports two shapes:
- Single-zone (default): the entries are building elements directly (
walls,floor,roof, …). On import they are placed into one rekenzone. The top-levelbuilding_layersbecomes that zone's floor areas per storey. - Multi-zone: the entries are
rekenzoneentries. Each becomes its own rekenzone. If any top-level entry is arekenzone, the file is treated as multi-zone and all top-level entries must berekenzoneentries. (zoneis accepted as an alias forrekenzone.)
A rekenzone entry has the following structure:
{
"type": "rekenzone",
"name": "Rekenzone A",
"building_layers": ["1.38", "13.9", "24.74", "2.72"],
"childrenGroups": [ /* building elements for this zone */ ]
}
| Field | Required | Type | Description |
|---|---|---|---|
type | Yes | "rekenzone" | Marks this entry as a rekenzone ("zone" also accepted) |
name | No | string | Zone name. Defaults to "Rekenzone" (auto-numbered) when omitted. |
building_layers | No | array of strings | Floor area per storey (m²) for this zone |
childrenGroups | No | array | Building elements in this zone — same structure as below |
When importing a multi-zone file, one new rekenzone is created per
rekenzoneentry. Multi-zone files always create new zones (they are never merged into an existing zone).
Building Elements (childrenGroups)
Each element in childrenGroups has the following structure:
{
"type": "walls",
"name": "Voorgevel",
"additionalFields": { ... },
"childrenGroups": [ ... ]
}
Common Fields
| Field | Required | Type | Description |
|---|---|---|---|
type | Yes | string (enum) | Element type — see Element Types |
name | No | string | Display label in the intake form. Defaults to the Dutch element type name if omitted ("Gevel", "Vloer", "Dak", "Raam", "Deur", "Paneel"). |
additionalFields | No | object | Geometry properties — all values must be strings. Omit the key entirely if no geometry is provided. |
childrenGroups | No | array | Child elements (openings inside this element). Defaults to [] if omitted. |
additionalFields per Element Type
All fields inside additionalFields are optional. Omitted fields are left blank in the intake form and must be filled in manually.
| Field | Unit | Applies to | Description |
|---|---|---|---|
surface_area | m² | All types | Gross area including any openings |
height | m | All types | Element height |
width | m | All types | Element width |
cardinal_point | — | walls, roof, window | Orientation — see Cardinal Points. Defaults to s. |
inclination | ° | walls, floor, roof | Tilt angle: 0 = flat, 90 = vertical. Subgeometries inherit the parent value when omitted. Defaults: wall=90, sloped roof=45, floor/flat roof=0. |
adjacency | — | walls, floor, roof | Adjoining space — see Adjacency Types. Defaults to buitenlucht when omitted. |
perimeter | m | floor | Perimeter of the floor element |
glass_insulation | — | window | Glass type — see Glass Types |
windowFrameKind | — | window, panel | Frame material — see Frame Types |
rc_value | m²K/W | walls, floor, roof | Insulation Rc value. Leading — when present, insulation is set to "yes (Rc value)". |
insulation_thickness | mm | walls, floor, roof | Insulation thickness. Used only when rc_value is absent; insulation is then set to "yes (known insulation)". |
has_cavity | bool | walls | Whether a cavity (spouw) is present. Overrides the year-based default. |
cavity_depth | mm | walls | Cavity (spouw) depth. Optional; only applied when has_cavity is true. |
GUIDs and index values are auto-generated on import — do not include them in the JSON.
Isolation mapping
Isolation data is optional per element. When provided:
rc_valueis leading: if present, it is used andinsulation_thicknessis ignored.- otherwise
insulation_thicknessis used. has_cavity/cavity_depthset the cavity (spouw) for walls.- when none of these are present, the element keeps the form's default isolation (no insulation + a year-based cavity depth) for the advisor to complete.
Element Types
| Value | Default name | Description |
|---|---|---|
walls | Gevel | Facade / exterior wall |
floor | Vloer | Ground floor or intermediate floor |
roof | Dak | Sloped or flat roof |
window | Raam | Window (child of walls or roof) |
door | Deur | Door (child of walls) |
panel | Paneel | Opaque panel in a facade (child of walls) |
Windows and doors are nested as childrenGroups inside their parent wall or roof element.
Cardinal Points
| Value | Dutch |
|---|---|
n | Noord |
ne | Noordoost |
e | Oost |
se | Zuidoost |
s | Zuid (default) |
sw | Zuidwest |
w | West |
nw | Noordwest |
Glass Types
Applies to window elements only via glass_insulation.
| Value | Description |
|---|---|
enkelGlas | Enkel glas |
dubbelGlas | Dubbel glas |
hrGlasdubbelGlasMetCoating | HR glas |
hrPlusGlas | HR+ glas |
hrPlusPlusGlas | HR++ glas |
tripleHrGlas | Driedubbel glas |
Full Example
{
"building_year": "1978",
"building_height": "6.2",
"building_layers": ["48.0", "44.0"],
"childrenGroups": [
{
"type": "walls",
"name": "Voorgevel",
"additionalFields": {
"surface_area": "28.0",
"height": "5.4",
"width": "5.2",
"cardinal_point": "s"
},
"childrenGroups": [
{
"type": "window",
"name": "Raam woonkamer",
"additionalFields": {
"surface_area": "3.6",
"height": "1.5",
"width": "2.4",
"glass_insulation": "hrPlusPlusGlas"
}
},
{
"type": "door",
"name": "Voordeur",
"additionalFields": {
"surface_area": "1.98",
"height": "2.2",
"width": "0.9"
}
},
{
"type": "panel",
"additionalFields": {
"surface_area": "0.5",
"height": "0.5",
"width": "1.0"
}
}
]
},
{
"type": "walls",
"additionalFields": {
"surface_area": "38.0",
"height": "5.4",
"width": "7.0",
"cardinal_point": "e"
}
},
{
"type": "floor",
"name": "Begane grondvloer",
"additionalFields": {
"surface_area": "48.0",
"height": "8.0",
"width": "6.0",
"perimeter": "28.0"
}
},
{
"type": "roof",
"name": "Hellend dak voor",
"additionalFields": {
"surface_area": "30.0",
"height": "5.0",
"width": "6.0",
"cardinal_point": "s"
},
"childrenGroups": [
{
"type": "window",
"additionalFields": {
"surface_area": "0.9",
"height": "0.9",
"width": "1.0",
"glass_insulation": "dubbelGlas"
}
}
]
},
{
"type": "roof",
"additionalFields": {
"surface_area": "8.0",
"height": "4.0",
"width": "2.0"
}
}
]
}
Adjacency Types
Applies to walls, floor, and roof elements via adjacency. Defaults to buitenlucht when omitted.
| Value | Description |
|---|---|
buitenlucht | Outside air (default) |
grond | Ground |
kruipruimte | Crawl space |
aangrenzendeOnverwarmdeRuimte | Adjacent unheated space |
aangrenzendeOnverwarmdeSerre | Adjacent unheated conservatory |
aangrenzendeSterkGeventileerdeRuimte | Adjacent strongly ventilated space |
aangrenzendeOnverwarmdeKelder | Adjacent unheated basement |
aangrenzendeVerwarmdeRuimte | Adjacent heated space |
Frame Types
Applies to window and panel elements via windowFrameKind.
| Value | Description |
|---|---|
woodOrPlastic | Wood or plastic frame |
metalThermallyBroken | Metal, thermally broken |
metalNonThermallyBroken | Metal, not thermally broken |
Validation Rules
typeis the only required field per element; all other fields are optional- If
nameis omitted, the import assigns the Dutch default for the element type - If
childrenGroupsis omitted, it defaults to an empty list - All
additionalFieldsvalues must be strings, not numbers glass_insulationonly applies towindowelementswindowFrameKindapplies towindowandpanelelementsinclinationapplies towalls,floor, androof; subgeometries inherit from parentadjacencyapplies towalls,floor, androof; defaults tobuitenluchtwhen omittedperimeteronly applies tofloorelementscardinal_pointdefaults toswhen omitted on walls and roofs- Only
window,door, andpanelelements may appear as children ofwallsorroof