AIVA logo
AIVA Developer DocumentationBlueprint JSON contract
← Back to Documentation Hub
Developer Contract
Blueprint / JSON Contract

Blueprint Developer Contract

Complete technical specification for Blueprint configuration files.

Last Updated 2026-06-23

Blueprint Developer Contract

1. Overview

A Blueprint is a JSON document that describes one log visualisation project. It defines project identity, source data files, optional colour maps, scenes, ranges, 2D tracks, optional 3D rendering, scalar curves, array curves, synthetic curves, regions, statistics, and cross-sections.

This document describes the JSON contract: object structure, property names, data types, defaults, constraints, examples, and cross-reference rules. Section-level JSON examples show only the properties that belong to that section. Nested objects are documented in their own linked subsections.

Blueprint files can be used directly or included inside an .aivapkg package. For archive structure, manifest rules, and packaging requirements, see the AIVAPKG packaging guide.


2. Root Object

The root object contains the file header and the Blueprint project definition.

{
  "Header": {},
  "Blueprint": {}
}
Property Type Required Default Constraints / Description
Header object Yes - File-level version and optional metadata. Version and metadata fields are defined below.
Header.Version string Yes "1" Must be the string "1". Do not emit as unquoted numeric value 1.
Header.Metadata object No {} Optional string-to-string metadata dictionary. All metadata keys and values should be strings.
Blueprint object Yes - Top-level container for the project definition.
Blueprint.Project object Yes - Required project object containing data sources, colour maps and scenes. See Project.

3. Project

Project is the root of the visualisation definition.

{
  "Id": "project-main",
  "Name": "",
  "DataSources": [],
  "ColourMaps": [],
  "Scenes": []
}
Property Type Required Default Constraints / Description
Id string Yes - Project identifier. Must use the ID Format.
Name string No "" Optional human-readable project name. Maximum 100 characters. During upload, the user normally enters the project name in the AIVA upload interface. If this field is omitted or left empty, the user-entered upload name is used. If this field contains a non-empty value, the Blueprint value always takes precedence over any user-entered value.
DataSources array of objects Yes - Must contain at least one data source. Data source IDs and paths must be unique. See Data Sources.
ColourMaps array of objects No [] Optional reusable colour maps. Colour map IDs must be unique when supplied. See Colour Maps.
Scenes array of objects Yes - Must contain at least one scene. See Scenes.

Project name precedence: The upload interface normally supplies the project name. If Blueprint.Project.Name is omitted or set to an empty string, AIVA uses the name entered by the user during upload. If Blueprint.Project.Name is specified with a non-empty value, that Blueprint value is always used instead of the user-entered upload value. Use this field only when the Blueprint must enforce a fixed project naming convention whenever it is uploaded into AIVA.


4. Data Sources

A data source defines the file that supplies curve data for one or more tracks.

{
  "Id": "ds-main",
  "Type": "LAS2",
  "Configuration": {},
  "Labels": []
}
Property Type Required Default Constraints / Description
Id string Yes - Unique data source identifier. Must use the ID Format.
Type string enum (DataSourceType) Yes LAS2 Supported value: LAS2. See Core Enums.
Configuration object Yes - Type-specific data source configuration. See LAS2 Configuration.
Labels array of objects No [] Optional display label and unit override table. See Labels.

4.1 LAS2 Configuration

Applicable when DataSources[].Type is LAS2.

{
  "Path": "data/main.las"
}
Property Type Required Default Constraints / Description
Path string Yes - Relative path to the LAS2 file. When used inside an .aivapkg, prefer paths under data/.

Allowed path examples:

data/main.las
../las/main.las

Rejected path examples:

/data/main.las
\server\share\main.las
C:\data\main.las

5. Curve ID Mapping

For LAS2 data sources, Blueprint CurveId values map to identifiers in the source data file.

A CurveId is not a Blueprint object ID. It is a source-data reference. Do not apply the ID Format to source data curve identifiers unless a field is explicitly documented as a Blueprint object ID.

Usage Type Match Style Constraints / Description
Scalar curve CurveId string Exact source data curve identifier Should match a curve identifier in the source data.
Array curve CurveId string Prefix Should resolve to multiple source data curves such as TARR1, TARR2, TARR3.
Label override CurveId string Exact or prefix Prefix-level overrides apply in array contexts.
Cross-section curve CurveId string Exact or prefix May reference scalar or array data depending on context.

6. Labels

DataSources[].Labels[] remaps display labels and units without changing the underlying CurveId.

{
  "Labels": [
    {
      "CurveId": "TARR",
      "Default": "Transit Time Array",
      "Title": "TARR",
      "Unit": "µs/m"
    }
  ]
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve identifier or array prefix. Maximum 100 characters. This is not required to follow the ID Format.
Default string Conditional - General display label. Maximum 50 characters. At least one of Default, Title, or Unit must be supplied.
Title string Conditional - Track-title label. Maximum 50 characters. At least one of Default, Title, or Unit must be supplied.
Unit string Conditional - Unit label override. Maximum 50 characters. At least one of Default, Title, or Unit must be supplied.

Label resolution:

Context Resolution Chain
Track title Title → Default → source CurveId
Other display labels Default → source CurveId
Units Unit → source unit

If a label override CurveId matches the array prefix used by an array context, that prefix-level override applies to all matched array channels in that context.


7. Colour Maps

Colour maps define reusable gradients for array heatmaps.

{
  "ColourMaps": [
    {
      "Id": "cm-thermal",
      "Name": "Thermal",
      "GradientSteps": []
    }
  ]
}
Property Type Required Default Constraints / Description
Id string Yes - Unique colour map identifier. Must use the ID Format.
Name string No - Human-readable colour map name. Maximum 50 characters.
GradientSteps array of objects Yes - Must contain between 2 and 67 gradient steps. Offsets must be unique within the colour map. See Gradient Steps.

7.1 Gradient Steps

GradientSteps[] defines the colour stops used to build a heatmap gradient.

{
  "GradientSteps": [
    {
      "Offset": 0.0,
      "Colour": "#0000FF"
    },
    {
      "Offset": 0.5,
      "Colour": "#00FF00"
    },
    {
      "Offset": 1.0,
      "Colour": "#FF0000"
    }
  ]
}
Property Type Required Default Constraints / Description
Offset decimal Yes - Decimal from 0 to 1 inclusive. Maximum decimal precision: 1 digit before and 4 digits after the decimal point. Must be unique within the colour map.
Colour string No #000 Hex colour. Must be #RGB or #RRGGBB.

8. Scenes

A scene is a self-contained visualisation context within a Project.

{
  "Scenes": [
    {
      "Id": "scene-main-run",
      "Name": "Main Run",
      "Ranges": {},
      "Views": {}
    }
  ]
}
Property Type Required Default Constraints / Description
Scenes array of objects Yes - Project must contain at least one scene.
Scenes[].Id string No - Optional scene identifier. If supplied, must use the ID Format.
Scenes[].Name string Yes - Scene display name. Maximum 100 characters.
Scenes[].Ranges object Yes - Defines full and starting depth/index ranges. See Ranges.
Scenes[].Views object Yes - Container for the required 2D view and optional 3D view. See Views.

8.1 Scene Resource Limits

These constraints apply per scene.

Constraint Type Limit / Behaviour
Tracks per scene integer Maximum 15 tracks.
Distinct data sources per scene integer Maximum 10 distinct DataSourceId values across tracks and isolated outer diameter configuration.
2D view object Required.
3D view object Optional.
Visible tracks integer At least one 2D track must be visible.

The distinct data source limit is based on scene usage, not the total number of project data sources.

8.2 Views

Views groups the scene's 2D and optional 3D visualisation configuration.

{
  "Views": {
    "2D": {},
    "3D": {}
  }
}
Property Type Required Default Constraints / Description
2D object Yes - Required 2D view. See 2D View.
3D object No - Optional 3D view. When supplied, it must reference an array track in the same scene. See 3D View.

9. Ranges

Each scene requires Ranges.Full and Ranges.Starting.

{
  "Ranges": {
    "Full": {
      "Min": 0.0,
      "Max": 100.0
    },
    "Starting": {
      "Min": 10.0,
      "Max": 30.0
    }
  }
}
Property Type Required Default Constraints / Description
Full object Yes - Complete scrollable depth/index range for the scene. See Full Range.
Starting object Yes - Initial viewport depth/index range. Must sit inside Full. See Starting Range.

Containment rule:

Starting.Min >= Full.Min
Starting.Max <= Full.Max

9.1 Full Range

Full defines the complete available range for the scene.

{
  "Full": {
    "Min": 0.0,
    "Max": 100.0
  }
}
Property Type Required Default Constraints / Description
Min decimal Yes - Minimum full-range depth/index value. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
Max decimal Yes - Maximum full-range depth/index value. Must be greater than Min. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.

9.2 Starting Range

Starting defines the initial viewport range for the scene.

{
  "Starting": {
    "Min": 10.0,
    "Max": 30.0
  }
}
Property Type Required Default Constraints / Description
Min decimal Yes - Minimum starting depth/index value. Must be greater than or equal to Ranges.Full.Min. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
Max decimal Yes - Maximum starting depth/index value. Must be less than or equal to Ranges.Full.Max and greater than Min. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.

10. 2D View

Views.2D defines the side-by-side log-track layout for a scene. Its Tracks collection is documented in Tracks.

{
  "2D": {
    "Tracks": []
  }
}
Property Type Required Default Constraints / Description
Tracks array of objects Yes - Must be non-null and non-empty. Maximum 15 tracks per scene. Track IDs must be unique within the 2D view. At least one track must be visible. See Tracks.

11. Tracks

A scene can define a maximum of 15 tracks. See Scene Resource Limits.

{
  "Id": "track-array",
  "Position": 1,
  "DataSourceId": "ds-main",
  "Data": {},
  "Visible": true,
  "Title": "Transit Time",
  "Subtitle": "Array Track",
  "ProportionalWidth": 2,
  "Statistics": {},
  "CrossSection": {}
}
Property Type Required Default Constraints / Description
Id string Yes - Track identifier. Must use the ID Format. Must be unique within the 2D view.
Position integer No 1 Track layout position. Minimum 1.
DataSourceId string Yes - Must use the ID Format. Must reference Project.DataSources[].Id. Counts toward the scene-level distinct data source limit.
Data object Yes - Must define array, scalar, synthetic, or region content. See Track Data Rules.
Visible boolean No true At least one track in the 2D view must be visible.
Title string No - Optional display title. Maximum 50 characters.
Subtitle string No - Optional display subtitle. Maximum 50 characters.
ProportionalWidth integer No 1 Relative display width. Integer from 1 to 4.
Statistics object No - Optional statistics include/exclude configuration. See Statistics.
CrossSection object No - Optional cross-section configuration. See Cross Sections.

12. Track Data Rules

Data supports array data or scalar/non-array track content. Scalar content is represented by reference curves, synthetic curves, and regions rather than array heatmap/line data.

Array data example:

{
  "Data": {
    "Array": {}
  }
}

Scalar Curve Data Example:

{
  "Data": {
    "ReferenceCurves": [],
    "SyntheticCurves": [],
    "Regions": []
  }
}
Property Type Required Default Constraints / Description
Array object Conditional - Multi-channel array data. If supplied, it cannot be combined with ReferenceCurves, SyntheticCurves, or Regions. See Array Data.
ReferenceCurves array of objects Conditional - Source scalar curves from the data source. Can coexist with SyntheticCurves and Regions. See Reference Curves.
SyntheticCurves array of objects Conditional - Fixed-value curves defined by the Blueprint. Can coexist with ReferenceCurves and Regions. See Synthetic Curves.
Regions array of objects Conditional - Filled regions between boundaries. Can coexist with scalar curve collections. See Regions.

Rules:

  1. At least one data member must be supplied.
  2. Array cannot be combined with ReferenceCurves, SyntheticCurves, or Regions.
  3. Non-array scalar/region members can coexist.
  4. Array overlays should use Array.Overlay, not a separate scalar curve collection in the same track.

13. Array Data

{
  "Data": {
    "Array": {
      "Curve": {},
      "Options": {},
      "Overlay": {}
    }
  }
}
Property Type Required Default Constraints / Description
Curve object Yes - Array curve binding. See Array Curve.
Options object Yes - Array rendering and reduction options. See Array Options.
Overlay object No - Optional scalar overlay for the array. See Overlay.

13.1 Array Curve

{
  "CurveId": "TARR",
  "IndexRange": "ALL"
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve prefix or array curve identifier. Maximum 100 characters. This is not required to follow the ID Format.
IndexRange string Yes ALL Maximum 200 characters. Must match Index Range Syntax.

13.2 Array Options

{
  "DataReductionType": "Avg",
  "EdgeBufferWidth": 0,
  "Heatmap": {},
  "Lines": {}
}
Property Type Required Default Constraints / Description
DataReductionType string enum (DataReductionType) Yes - Valid Data Reduction Type. See Core Enums.
EdgeBufferWidth integer No 0 Minimum 0.
Heatmap object Conditional - At least one of Heatmap or Lines must be supplied. See Heatmap.
Lines object Conditional - At least one of Heatmap or Lines must be supplied. See Lines.

13.3 Heatmap

{
  "Enabled": true,
  "ColourMapId": "cm-thermal",
  "MinValue": 0.0,
  "MaxValue": 100.0
}
Property Type Required Default Constraints / Description
Enabled boolean No true Controls heatmap display.
ColourMapId string Yes - Must use the ID Format. Must reference Project.ColourMaps[].Id.
MinValue decimal Yes - Minimum heatmap value. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
MaxValue decimal Yes - Maximum heatmap value. Maximum decimal precision: 8 digits before and 4 digits after the decimal point. Must be greater than MinValue.

13.4 Lines

{
  "CentreId": 8.0,
  "Swing": 4.0,
  "CentreLines": {
    "Visible": true
  },
  "Dividers": {
    "Visible": true
  },
  "LineColour": "#000000",
  "LineThickness": 1,
  "LineStyle": "Solid"
}
Property Type Required Default Constraints / Description
CentreId decimal Yes - Value represented at the centre line for the array line display. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
Swing decimal Yes - Gap between neighbouring channel centrelines in the array line display. Maximum decimal precision: 4 digits before and 4 digits after the decimal point.
CentreLines object No Defaults applied by model Centre line display settings. See Centre Lines.
Dividers object No Defaults applied by model Divider display settings. See Dividers.
LineColour string No #000 Hex colour. Must be #RGB or #RRGGBB.
LineThickness integer No 1 Minimum 1.
LineStyle string enum (LineStyle) No Solid Valid line style. See Core Enums.

13.5 Centre Lines

CentreLines controls whether centre lines are shown for array line rendering.

{
  "CentreLines": {
    "Visible": true
  }
}
Property Type Required Default Constraints / Description
Visible boolean No false Shows or hides centre lines.

13.6 Dividers

Dividers controls whether divider lines are shown for array line rendering.

{
  "Dividers": {
    "Visible": true
  }
}
Property Type Required Default Constraints / Description
Visible boolean No false Shows or hides dividers.

13.7 Overlay

{
  "Visible": true,
  "CurveId": "CALI",
  "MinScale": 0.0,
  "MaxScale": 20.0,
  "LineColour": "#FFFFFF",
  "LineThickness": 1,
  "LineStyle": "Solid"
}
Property Type Required Default Constraints / Description
Visible boolean No false Controls whether the overlay is shown.
CurveId string Yes - Required when overlay configuration is supplied. Source data scalar curve identifier. Maximum 100 characters.
MinScale decimal Yes - Required when overlay configuration is supplied. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
MaxScale decimal Yes - Required when overlay configuration is supplied. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
LineColour string Yes - Required when overlay configuration is supplied. Hex colour.
LineThickness integer No 1 Minimum 1.
LineStyle string enum (LineStyle) No Solid Valid line style. See Core Enums.

For overlays on array tracks, MinScale and MaxScale should normally align with the array's expected start and end channel range.


14. Scalar Curves

Shared scalar rendering fields:

{
  "CurveId": "GR",
  "DataReductionType": "Avg",
  "MinScale": 0.0,
  "MaxScale": 150.0,
  "LineColour": "#00FF00",
  "LineThickness": 1,
  "LineStyle": "Solid"
}
Property Type Required Default Constraints / Description
MinScale decimal Yes - Minimum display scale. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
MaxScale decimal Yes - Maximum display scale. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
LineColour string Yes - Hex colour. Must be #RGB or #RRGGBB.
LineThickness integer No 1 Minimum 1.
LineStyle string enum (LineStyle) No Solid Valid line style. See Core Enums.

14.1 Reference Curves

{
  "CurveId": "GR",
  "DataReductionType": "Avg",
  "MinScale": 0.0,
  "MaxScale": 150.0,
  "LineColour": "#00FF00",
  "LineThickness": 1,
  "LineStyle": "Solid"
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve identifier. Maximum 100 characters. This is not required to follow the ID Format.
DataReductionType string enum (DataReductionType) Yes - Valid Data Reduction Type. See Core Enums.

14.2 Synthetic Curves

{
  "Value": 80.0,
  "Label": "Threshold",
  "UnitLabel": "API",
  "MinScale": 0.0,
  "MaxScale": 150.0,
  "LineColour": "#FF0000",
  "LineThickness": 1,
  "LineStyle": "Dotted"
}
Property Type Required Default Constraints / Description
Value decimal Yes - Fixed synthetic value. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
Label string Yes - Non-empty display label. Maximum 50 characters.
UnitLabel string Yes - Non-empty unit label. Maximum 50 characters.

15. Regions

A region fills the area between two boundaries.

{
  "StartBoundary": {},
  "EndBoundary": {},
  "FillColour": "#FFCCCC",
  "TitleLabel": "High GR",
  "UnitLabel": "API"
}
Property Type Required Default Constraints / Description
StartBoundary object Yes - Region start boundary. See Boundary Properties.
EndBoundary object Yes - Region end boundary. See Boundary Properties.
FillColour string Yes - Hex colour. Must be #RGB or #RRGGBB.
TitleLabel string No - Optional display label. Maximum 50 characters. If omitted, no region title element is displayed.
UnitLabel string No - Optional unit label. Maximum 50 characters.

15.1 Boundary Properties

{
  "BoundarySource": {},
  "MinScale": 0.0,
  "MaxScale": 150.0
}
Property Type Required Default Constraints / Description
BoundarySource object Yes - Defines whether the boundary is a reference or synthetic value. See Boundary Source.
MinScale decimal Yes - Minimum boundary scale. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
MaxScale decimal Yes - Maximum boundary scale. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.

15.2 Boundary Source

Reference boundary source example:

{
  "BoundaryType": "Reference",
  "CurveId": "GR",
  "DataReductionType": "Avg"
}

Synthetic boundary source example:

{
  "BoundaryType": "Synthetic",
  "Value": 80.0
}
Property Type Required Default Constraints / Description
BoundaryType string enum (BoundaryType) Yes - Reference or Synthetic. See Core Enums.
CurveId string Required for Reference - Source data curve identifier. Maximum 100 characters.
DataReductionType string enum (DataReductionType) Required for Reference - Valid Data Reduction Type. See Core Enums.
Value decimal Required for Synthetic - Synthetic boundary value. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.

16. Statistics

Statistics.Include contains additional source curves to include in statistics. Statistics.Exclude contains source curves to suppress.

By default, statistics are generated for rendered reference-backed source curves on the track. Use Include to add additional source curves and Exclude to suppress automatically included source curves.

{
  "Statistics": {
    "Include": [],
    "Exclude": []
  }
}
Property Type Required Default Constraints / Description
Include array of objects No [] Statistics include collection. See Statistics Include.
Exclude array of objects No [] Statistics exclude collection. See Statistics Exclude.

16.1 Statistics Include

{
  "CurveId": "GR",
  "DataReductionType": "Avg"
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve identifier. Maximum 100 characters.
DataReductionType string enum (DataReductionType) Yes - Valid Data Reduction Type. See Core Enums.

16.2 Statistics Exclude

{
  "CurveId": "NOISE"
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve identifier. Maximum 100 characters.

17. Cross Sections

A cross-section is optional on a track.

{
  "CrossSection": {
    "HighlightedCurve": {},
    "Curves": []
  }
}
Property Type Required Default Constraints / Description
Curves array of objects Yes - Must be non-null and non-empty when CrossSection is supplied. See Cross Section Curves.
HighlightedCurve object No - Optional highlighted curve. See Highlighted Curve.

17.1 Highlighted Curve

A highlighted curve is a single prominent curve used to emphasise one cross-section value or indicator. It is separate from the Curves collection, which defines the normal cross-section rings/curve set.

{
  "CurveId": "CALI",
  "Colour": "#00FF00",
  "DataReductionType": "Avg",
  "MinScale": 0.0,
  "MaxScale": 20.0
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve identifier. Maximum 100 characters.
Colour string Yes - Hex colour. Must be #RGB or #RRGGBB.
DataReductionType string enum (DataReductionType) Yes - Valid Data Reduction Type. See Core Enums.
MinScale decimal Yes - Minimum display scale for the highlighted curve. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.
MaxScale decimal Yes - Maximum display scale for the highlighted curve. Maximum decimal precision: 8 digits before and 4 digits after the decimal point.

17.2 Cross Section Curves

{
  "CurveId": "TARR",
  "Colour": "#FF0000",
  "IndexRange": "ALL",
  "DataReductionType": "Avg"
}
Property Type Required Default Constraints / Description
CurveId string Yes - Source data curve identifier or array prefix. Maximum 100 characters.
Colour string Yes - Hex colour. Must be #RGB or #RRGGBB.
IndexRange string No - Optional. Must match Index Range Syntax when supplied. Intended only for curves that resolve to array data; omit for scalar curves.
DataReductionType string enum (DataReductionType) Yes - Valid Data Reduction Type. See Core Enums.

The source data parser is responsible for proving that a CurveId with an IndexRange resolves to actual array data.


18. 3D View

Views.3D is optional. When present, it must reference a 2D array track in the same scene.

{
  "3D": {
    "DataReductionType": "Avg",
    "TrackId": "track-array",
    "Markup": {},
    "Display": {}
  }
}
Property Type Required Default Constraints / Description
DataReductionType string enum (DataReductionType) Yes - Valid Data Reduction Type. See Core Enums.
TrackId string Yes - Must use the ID Format. Must reference a 2D track in the same scene, and that track must use array data.
Markup object No Defaults applied by model Optional 3D markup configuration. See Markup.
Display object No Defaults applied by model Optional 3D display configuration. See Display.

19. Markup

Markup contains optional 3D annotation and overlay display settings. Its nested objects are documented in Axes, Position Indicator, Markup Labels, and Colour Scale.

{
  "Markup": {
    "Axes": {},
    "PositionIndicator": {},
    "Labels": {},
    "ColourScale": {}
  }
}
Property Type Required Default Constraints / Description
Axes object No Defaults applied by model Controls 3D axes helper visibility. See Axes.
PositionIndicator object No Defaults applied by model Controls the 3D position indicator. See Position Indicator.
Labels object No Defaults applied by model Controls 3D channel and depth labels. See Markup Labels.
ColourScale object No Defaults applied by model Controls the colour scale legend. See Colour Scale.

19.1 Axes

Axes controls visibility of full-size and mini orientation helpers in the 3D view.

{
  "Axes": {
    "InlineAxesHelperVisible": true,
    "MiniAxesHelperVisible": true
  }
}
Property Type Required Default Constraints / Description
InlineAxesHelperVisible boolean No true Shows or hides the full-size inline XYZ axes helper.
MiniAxesHelperVisible boolean No true Shows or hides the mini orientation axes helper.

19.2 Position Indicator

PositionIndicator controls the current-position or hover indicator shown in the 3D view.

{
  "PositionIndicator": {
    "Type": "Crosshair",
    "IndicatorLabelsVisible": true
  }
}
Property Type Required Default Constraints / Description
Type string enum (PositionIndicatorType) No Crosshair None, Crosshair, or Dot. See Core Enums.
IndicatorLabelsVisible boolean No true Shows or hides labels associated with the position indicator.

19.3 Markup Labels

Labels controls channel and depth label display in the 3D view.

{
  "Labels": {
    "Channels": "Number",
    "Depth": "TopIntermediateBottom"
  }
}
Property Type Required Default Constraints / Description
Channels string enum (ChannelLabelStyle) No None Channel label display mode. See Core Enums.
Depth string enum (DepthLabelType) No None Depth label display mode. See Core Enums.

19.4 Colour Scale

ColourScale controls the 3D heatmap colour-scale legend.

{
  "ColourScale": {
    "Visible": true
  }
}
Property Type Required Default Constraints / Description
Visible boolean No true Shows or hides the colour-scale legend.

20. Display

Display contains 3D rendering, transform, cutaway, trajectory, drift tool and outer diameter configuration. Its nested objects are documented in Transform, Cutaway, Drift Tool, True Pipe Trajectory, and Outer Diameter.

{
  "Display": {
    "Mode": "TexturedWireframe",
    "Transform": {},
    "Cutaway": {},
    "DriftTool": {},
    "TruePipeTrajectory": {},
    "OuterDiameter": {}
  }
}
Property Type Required Default Constraints / Description
Mode string enum (DisplayMode) No TexturedWireframe 3D render mode. See Core Enums.
Transform object No Defaults applied by model 3D scale and rotation settings. See Transform.
Cutaway object No Defaults applied by model Cutaway display settings. See Cutaway.
DriftTool object No Defaults applied by model Drift tool display settings. See Drift Tool.
TruePipeTrajectory object No Defaults applied by model True pipe trajectory curve binding. See True Pipe Trajectory.
OuterDiameter object No Defaults applied by model Outer diameter display settings. See Outer Diameter.

20.1 Transform

Transform contains 3D scaling and rotation settings.

{
  "Transform": {
    "Scale": {},
    "Rotate": {}
  }
}
Property Type Required Default Constraints / Description
Scale object No Defaults applied by model 3D scale settings. See Scale.
Rotate object No Defaults applied by model 3D rotation settings. See Rotate.

20.2 Scale

Scale controls 3D XY and Z scaling.

{
  "Scale": {
    "XY": 1.0,
    "Z": 1.0
  }
}
Property Type Required Default Constraints / Description
XY decimal No 1 Greater than 0. Maximum decimal precision: 2 digits before and 2 digits after the decimal point.
Z decimal No 1 Greater than 0. Maximum decimal precision: 2 digits before and 2 digits after the decimal point.

20.3 Rotate

Rotate controls 3D rotation in degrees.

{
  "Rotate": {
    "X": 0,
    "Y": 0,
    "Z": 0
  }
}
Property Type Required Default Constraints / Description
X integer No 0 Rotation around the X axis. -360 to 360 degrees.
Y integer No 0 Rotation around the Y axis. -360 to 360 degrees.
Z integer No 0 Rotation around the Z axis. -360 to 360 degrees.

20.4 Cutaway

Cutaway controls the 3D cutaway wedge.

{
  "Cutaway": {
    "Enabled": true,
    "StartChannelNumber": 1
  }
}
Property Type Required Default Constraints / Description
Enabled boolean No false Enables or disables the cutaway wedge.
StartChannelNumber integer No 1 Starting 1-based channel number for the cutaway. Minimum 1.

20.5 Drift Tool

DriftTool controls the 3D drift tool overlay.

{
  "DriftTool": {
    "Visible": true,
    "Length": 1,
    "TopDiameter": 1,
    "BottomDiameter": 1,
    "InlineOffset": 0,
    "CrossLineOffset": 0
  }
}
Property Type Required Default Constraints / Description
Visible boolean No false Shows or hides the drift mandrel in the 3D view.
Length integer No 1 Physical length of the drift mandrel. Unitless - inherits its unit from the bound data source. Must be greater than zero when Visible is true.
TopDiameter integer No 1 Diameter of the mandrel at its top end. Unitless - inherits its unit from the bound data source. Must be greater than zero when Visible is true.
BottomDiameter integer No 1 Diameter of the mandrel at its bottom end. Unitless - inherits its unit from the bound data source. Must be greater than zero when Visible is true.
InlineOffset integer No 0 Lateral offset applied to the mandrel along the inline axis.
CrossLineOffset integer No 0 Lateral offset applied to the mandrel along the cross-line axis.

20.6 True Pipe Trajectory

TruePipeTrajectory controls curve-based true pipe trajectory display.

{
  "TruePipeTrajectory": {
    "Enabled": true,
    "DeltaXCurveId": "DX",
    "DeltaYCurveId": "DY"
  }
}
Property Type Required Default Constraints / Description
Enabled boolean No false Enables or disables true pipe trajectory.
DeltaXCurveId string Yes - Required when true pipe trajectory configuration is supplied. Source data curve identifier. Maximum 100 characters.
DeltaYCurveId string Yes - Required when true pipe trajectory configuration is supplied. Source data curve identifier. Maximum 100 characters.

21. Outer Diameter

OuterDiameter controls bound and isolated outer diameter display in the 3D view.

OuterDiameter.Bound uses the same data context as the referenced 3D array track.

OuterDiameter.Isolated uses its own DataSourceId and therefore counts toward the scene-level distinct data-source limit.

{
  "OuterDiameter": {
    "Bound": {},
    "Isolated": {}
  }
}
Property Type Required Default Constraints / Description
Bound object No Defaults applied by model Bound outer diameter configuration. See Bound Outer Diameter.
Isolated object No Defaults applied by model Isolated outer diameter configuration. See Isolated Outer Diameter.

21.1 Bound Outer Diameter

Bound displays outer diameter values using the same data context as the 3D track. In the current implementation this uses a scalar/non-array curve from the bound 3D track data source.

{
  "Bound": {
    "Visible": true,
    "CurveId": "OD",
    "Colour": "#00FF00",
    "Transparency": 0.5,
    "AddLogToValues": false
  }
}
Property Type Required Default Constraints / Description
Visible boolean No false Show bound outer diameter.
CurveId string Yes - Required when bound outer diameter configuration is supplied. Source data curve identifier. Maximum 100 characters.
Colour string No #00FF00 Hex colour. Must be #RGB or #RRGGBB.
Transparency decimal No 0.5 0 to 1. Maximum decimal precision: 1 digit before and 2 digits after the decimal point.
AddLogToValues boolean No false Adds outer diameter values to base channel values.

21.2 Isolated Outer Diameter

Isolated displays outer diameter using a separate data source. In the current implementation this uses array data from the separate data source.

{
  "Isolated": {
    "Visible": true,
    "DataSourceId": "ds-outer-diameter",
    "CurveId": "OD",
    "DisplayMode": "Textured",
    "Transparency": 0.5
  }
}
Property Type Required Default Constraints / Description
Visible boolean No false Show isolated outer diameter surface.
DataSourceId string Yes - Required when isolated outer diameter configuration is supplied. Must use the ID Format. Must reference Project.DataSources[].Id when used. Counts toward the scene-level distinct data-source limit.
CurveId string Yes - Required when isolated outer diameter configuration is supplied. Source data curve identifier. Maximum 100 characters.
DisplayMode string enum (DisplayMode) No Textured Valid display mode. See Core Enums.
Transparency decimal No 0.5 0 to 1. Maximum decimal precision: 1 digit before and 2 digits after the decimal point.

22. Track And Data Source Constraints

This section summarises cross-cutting constraints involving tracks and data sources.

Constraint Applies To Rule
Track count Scenes[].Views.2D.Tracks Maximum 15 tracks per scene.
Visible tracks Scenes[].Views.2D.Tracks[].Visible At least one track per scene must be visible. Omitted Visible behaves as true.
Track IDs Tracks[].Id Must be unique within the same 2D view and follow the ID Format.
Track data source reference Tracks[].DataSourceId Must reference a defined Project.DataSources[].Id.
Scene data source count Track data sources and isolated outer diameter data sources Maximum 10 distinct data source IDs per scene.
3D track reference Views.3D.TrackId Must reference a track in the same scene. The referenced track must use array data.
Heatmap colour map reference Heatmap.ColourMapId Must reference a defined Project.ColourMaps[].Id.
Isolated outer diameter data source OuterDiameter.Isolated.DataSourceId Must reference a defined data source when isolated outer diameter is used or visible.
Unused data source Project.DataSources[] A data source defined but unused by any scene may be reported as a warning by validating readers.
Unused colour map Project.ColourMaps[] A colour map defined but unused by any heatmap may be reported as a warning by validating readers.

23. ID Format

Blueprint uses string identifiers to link related parts of the project definition together. These identifiers are used for project IDs, data source IDs, scene IDs, colour map IDs, track IDs, and other cross-reference fields.

IDs are stable technical references. They are not display names.

23.1 Format

Blueprint object IDs must use this format and must be no longer than 50 characters:

^[A-Za-z0-9_-]+$

Maximum length: 50 characters.

Character Type Allowed
Uppercase letters A-Z Yes
Lowercase letters a-z Yes
Numbers 0-9 Yes
Underscore _ Yes
Hyphen - Yes
Spaces No
Dots . No
Slashes / or \ No
Colons : No
Other punctuation No

23.2 Valid Examples

project-main
PRJ-001
ds-main
ds_repeat_run
track-array-01
track_gr
cm-thermal
scene_main_run

23.3 Invalid Examples

project main        // spaces are not allowed
project.main        // dots are not allowed
data/source/main    // slashes are not allowed
C:\data\main        // path-style values are not IDs
track:array         // colon is not allowed
track#1             // hash is not allowed
this-id-is-far-too-long-because-it-exceeds-the-fifty-character-limit // exceeds 50 characters

23.5 IDs Vs Display Names

IDs are stable technical references:

{
  "Id": "track-gr"
}

Display names, titles, subtitles, and label overrides are human-readable UI text:

{
  "Title": "Gamma Ray"
}

Changing a display label should not break references. Changing an ID can break any field that references it.

23.6 IDs Vs Source Data Curve Identifiers

Blueprint object IDs are not the same thing as source data curve identifiers.

For example:

{
  "CurveId": "TARR[1]"
}

This may be valid as a source data curve reference even though it would not be valid as a Blueprint object ID.


24. Data Reduction Types

DataReductionType controls how multiple raw depth samples are collapsed into a single representative value when the viewer needs to reduce high-resolution data for 2D rendering, statistics, cross-sections, or 3D rendering.

24.1 Property Contract

Property Type Required Allowed Values
DataReductionType string enum (DataReductionType) Yes where specified Avg, Min, Max, AbsAvg, AbsMin, AbsMax

24.2 Performance Guidance

Each distinct DataReductionType used against a given data source can require retrieval or calculation of a separate reduced dataset for that source.

Aim to use no more than two distinct reduction types per data source across the whole Blueprint where practical. This includes reduction types used by:

  • array tracks;
  • scalar reference curves;
  • statistics include entries;
  • cross-section curves;
  • highlighted cross-section curves;
  • 3D view configuration.

Where the exact reduction method is not critical, prefer a reduction type already used by other curves from the same data source.

24.3 Depth-Window Behaviour

Reduction is applied per depth window, not per fixed sample count.

The window size is determined by the relationship between raw sample spacing and active display resolution. As the user zooms in, the window narrows. At sufficient zoom, raw samples may be displayed directly with little or no reduction.

24.4 Supported Values

Value Operation Description Typical Use
Avg Mean Arithmetic mean of all samples in the depth window. Smooths short-interval variation and represents the general trend. Formation-property curves and smoothly varying measurements where interval trend is more useful than isolated spikes.
Min Minimum Lowest signed value in the depth window. Preserves downward excursions. Caliper, standoff, clearance, or geometry-related curves where the smallest value may be significant.
Max Maximum Highest signed value in the depth window. Preserves upward excursions and narrow peaks. Borehole rugosity, washout detection, gamma ray peaks, or curves where maximum local excursion should remain visible.
AbsAvg Mean of absolute values Arithmetic mean of absolute sample values. Treats positive and negative excursions equally. Waveform-style, vibration, deviation error, residual, misfit, or zero-centred curves where magnitude matters more than polarity.
AbsMin Minimum absolute value Sample closest to zero, regardless of sign. Zero-centred error, offset, eccentricity, or differential curves where the most neutral condition is meaningful.
AbsMax Maximum absolute value Sample furthest from zero, regardless of sign. Preserves worst-case excursion magnitude. Vibration, shock, stick-slip, torque fluctuation, or curves where largest excursion in either direction is significant.

25. Index Range Syntax

Several Blueprint properties accept an IndexRange string to select a subset of array channels.

IndexRange is not a general depth range. It selects array channel indices, not measured depth/index values.

25.1 Property Contract

Property Type Required Default Rule
IndexRange string Context-specific ALL where omitted/defaulted ALL or a comma-separated list of valid non-negative integer range tokens.

25.2 Syntax Rule

An IndexRange is either:

ALL

or a comma-separated list of range tokens.

Only non-negative integers are valid. Spaces are not permitted anywhere in the string.

Token Form Meaning Example Selects
ALL All available indices ALL Every channel in the array
-N Up to and including N -20 0, 1, 2 … 20
N- From N to the end 30- 30, 31, 32 … last
N-M From N to M inclusive 10-20 10, 11, 12 … 20
N,M,… Discrete individual indices 1,2,3 1, 2, 3 only
Combination Union of all tokens -5,10-20,25,30- 0–5, 10–20, 25, 30–last

25.3 Valid Examples

{
  "IndexRange": "ALL"
}
{
  "IndexRange": "-20"
}
{
  "IndexRange": "30-"
}
{
  "IndexRange": "10-20"
}
{
  "IndexRange": "1,2,3"
}
{
  "IndexRange": "-5,10-20,25,30-"
}

25.4 Invalid Examples

10 - 20     // spaces are not allowed
1.5-3       // decimals are not allowed
-           // missing index value
A-B         // non-numeric values are not allowed
10--20      // malformed range
20-10       // descending ranges should be treated as invalid

26. Core Enums

Enum Type Valid Values
DataReductionType string enum (DataReductionType) Avg, Min, Max, AbsAvg, AbsMin, AbsMax
DataSourceType string enum (DataSourceType) LAS2
LineStyle string enum (LineStyle) Solid, Dashed, Dotted, Dash-Dot, Dash-Dot-Dot
BoundaryType string enum (BoundaryType) Reference, Synthetic
DisplayMode string enum (DisplayMode) Textured, Wireframe, TexturedWireframe
ChannelLabelStyle string enum (ChannelLabelStyle) None, Radii, Number, Degrees
PositionIndicatorType string enum (PositionIndicatorType) None, Crosshair, Dot
DepthLabelType string enum (DepthLabelType) None, Top, Intermediate, Bottom, TopIntermediate, TopBottom, IntermediateBottom, TopIntermediateBottom

27. Minimum Usable Example

This example shows the smallest practical Blueprint shape for a single visible scalar track. It includes one data source, one scene, one 2D view and one visible track. Project.Name is omitted so the project name can be supplied by the user during upload.

{
  "Header": {
    "Version": "1",
    "Metadata": {}
  },
  "Blueprint": {
    "Project": {
      "Id": "project-minimum",
      "DataSources": [
        {
          "Id": "ds-main",
          "Type": "LAS2",
          "Configuration": {
            "Path": "data/main.las"
          },
          "Labels": []
        }
      ],
      "ColourMaps": [],
      "Scenes": [
        {
          "Name": "Main Scene",
          "Ranges": {
            "Full": {
              "Min": 0.0,
              "Max": 100.0
            },
            "Starting": {
              "Min": 0.0,
              "Max": 25.0
            }
          },
          "Views": {
            "2D": {
              "Tracks": [
                {
                  "Id": "track-gr",
                  "Position": 1,
                  "DataSourceId": "ds-main",
                  "Data": {
                    "ReferenceCurves": [
                      {
                        "CurveId": "GR",
                        "DataReductionType": "Avg",
                        "MinScale": 0.0,
                        "MaxScale": 150.0,
                        "LineColour": "#00FF00",
                        "LineThickness": 1,
                        "LineStyle": "Solid"
                      }
                    ]
                  },
                  "Visible": true,
                  "Title": "Gamma Ray",
                  "Subtitle": "Main",
                  "ProportionalWidth": 1
                }
              ]
            }
          }
        }
      ]
    }
  }
}

28. Rich Example

The following example is intentionally broad. It shows how the major Blueprint objects can fit together in one document. It is not intended to be a recommended minimum configuration. Because this example includes Project.Name, that value would override any project name entered by the user during upload.

{
  "Header": {
    "Version": "1",
    "Metadata": {
      "Author": "Example",
      "Company": "Example Co",
      "ExportedAt": "2026-06-10"
    }
  },
  "Blueprint": {
    "Project": {
      "Id": "project-rich-example",
      "Name": "Rich Example",
      "DataSources": [
        {
          "Id": "ds-main",
          "Type": "LAS2",
          "Configuration": {
            "Path": "data/main.las"
          },
          "Labels": [
            {
              "CurveId": "GR",
              "Default": "Gamma Ray",
              "Title": "GR",
              "Unit": "API"
            },
            {
              "CurveId": "TARR",
              "Default": "Transit Time Array",
              "Title": "Transit Time",
              "Unit": "µs/m"
            }
          ]
        },
        {
          "Id": "ds-outer-diameter",
          "Type": "LAS2",
          "Configuration": {
            "Path": "data/outer-diameter.las"
          },
          "Labels": []
        }
      ],
      "ColourMaps": [
        {
          "Id": "cm-thermal",
          "Name": "Thermal",
          "GradientSteps": [
            {
              "Offset": 0.0,
              "Colour": "#0000FF"
            },
            {
              "Offset": 0.5,
              "Colour": "#00FF00"
            },
            {
              "Offset": 1.0,
              "Colour": "#FF0000"
            }
          ]
        }
      ],
      "Scenes": [
        {
          "Id": "scene-main-run",
          "Name": "Main Run",
          "Ranges": {
            "Full": {
              "Min": 0.0,
              "Max": 100.0
            },
            "Starting": {
              "Min": 10.0,
              "Max": 30.0
            }
          },
          "Views": {
            "2D": {
              "Tracks": [
                {
                  "Id": "track-array",
                  "Position": 1,
                  "DataSourceId": "ds-main",
                  "Visible": true,
                  "Title": "Array",
                  "Subtitle": "Transit Time",
                  "ProportionalWidth": 2,
                  "Data": {
                    "Array": {
                      "Curve": {
                        "CurveId": "TARR",
                        "IndexRange": "ALL"
                      },
                      "Options": {
                        "DataReductionType": "Avg",
                        "EdgeBufferWidth": 0,
                        "Heatmap": {
                          "Enabled": true,
                          "ColourMapId": "cm-thermal",
                          "MinValue": 0.0,
                          "MaxValue": 100.0
                        },
                        "Lines": {
                          "CentreId": 8.0,
                          "Swing": 4.0,
                          "CentreLines": {
                            "Visible": true
                          },
                          "Dividers": {
                            "Visible": true
                          },
                          "LineColour": "#000000",
                          "LineThickness": 1,
                          "LineStyle": "Solid"
                        }
                      },
                      "Overlay": {
                        "Visible": true,
                        "CurveId": "CALI",
                        "DataReductionType": "Max",
                        "MinScale": 0.0,
                        "MaxScale": 20.0,
                        "LineColour": "#FFFFFF",
                        "LineThickness": 2,
                        "LineStyle": "Dashed"
                      }
                    }
                  },
                  "Statistics": {
                    "Include": [
                      {
                        "CurveId": "TARR",
                        "DataReductionType": "Avg"
                      }
                    ],
                    "Exclude": [
                      {
                        "CurveId": "NOISE"
                      }
                    ]
                  },
                  "CrossSection": {
                    "HighlightedCurve": {
                      "CurveId": "CALI",
                      "Colour": "#00FF00",
                      "DataReductionType": "Avg",
                      "MinScale": 0.0,
                      "MaxScale": 20.0
                    },
                    "Curves": [
                      {
                        "CurveId": "TARR",
                        "Colour": "#FF0000",
                        "IndexRange": "1-8",
                        "DataReductionType": "Avg"
                      }
                    ]
                  }
                },
                {
                  "Id": "track-scalar",
                  "Position": 2,
                  "DataSourceId": "ds-main",
                  "Visible": true,
                  "Title": "Scalar Curves",
                  "Subtitle": "Reference, Synthetic And Regions",
                  "ProportionalWidth": 1,
                  "Data": {
                    "ReferenceCurves": [
                      {
                        "CurveId": "GR",
                        "DataReductionType": "Max",
                        "MinScale": 0.0,
                        "MaxScale": 150.0,
                        "LineColour": "#00FF00",
                        "LineThickness": 1,
                        "LineStyle": "Solid"
                      }
                    ],
                    "SyntheticCurves": [
                      {
                        "Value": 80.0,
                        "Label": "Threshold",
                        "UnitLabel": "API",
                        "MinScale": 0.0,
                        "MaxScale": 150.0,
                        "LineColour": "#FF0000",
                        "LineThickness": 1,
                        "LineStyle": "Dotted"
                      }
                    ],
                    "Regions": [
                      {
                        "StartBoundary": {
                          "BoundarySource": {
                            "BoundaryType": "Reference",
                            "CurveId": "GR",
                            "DataReductionType": "Avg"
                          },
                          "MinScale": 0.0,
                          "MaxScale": 150.0
                        },
                        "EndBoundary": {
                          "BoundarySource": {
                            "BoundaryType": "Synthetic",
                            "Value": 80.0
                          },
                          "MinScale": 0.0,
                          "MaxScale": 150.0
                        },
                        "FillColour": "#FFCCCC",
                        "TitleLabel": "High GR",
                        "UnitLabel": "API"
                      }
                    ]
                  },
                  "Statistics": {
                    "Include": [
                      {
                        "CurveId": "GR",
                        "DataReductionType": "Avg"
                      }
                    ],
                    "Exclude": []
                  }
                }
              ]
            },
            "3D": {
              "DataReductionType": "Avg",
              "TrackId": "track-array",
              "Markup": {
                "Axes": {
                  "InlineAxesHelperVisible": true,
                  "MiniAxesHelperVisible": true
                },
                "PositionIndicator": {
                  "Type": "Crosshair",
                  "IndicatorLabelsVisible": true
                },
                "Labels": {
                  "Channels": "Number",
                  "Depth": "TopIntermediateBottom"
                },
                "ColourScale": {
                  "Visible": true
                }
              },
              "Display": {
                "Mode": "TexturedWireframe",
                "Transform": {
                  "Scale": {
                    "XY": 1.0,
                    "Z": 1.0
                  },
                  "Rotate": {
                    "X": 0,
                    "Y": 0,
                    "Z": 0
                  }
                },
                "Cutaway": {
                  "Enabled": true,
                  "StartChannelNumber": 1
                },
                "DriftTool": {
                  "Visible": true,
                  "Length": 10,
                  "TopDiameter": 4,
                  "BottomDiameter": 4,
                  "InlineOffset": 0,
                  "CrossLineOffset": 0
                },
                "TruePipeTrajectory": {
                  "Enabled": true,
                  "DeltaXCurveId": "DX",
                  "DeltaYCurveId": "DY"
                },
                "OuterDiameter": {
                  "Bound": {
                    "Visible": true,
                    "CurveId": "OD",
                    "Colour": "#00FF00",
                    "Transparency": 0.5,
                    "AddLogToValues": false
                  },
                  "Isolated": {
                    "Visible": true,
                    "DataSourceId": "ds-outer-diameter",
                    "CurveId": "OD",
                    "DisplayMode": "Textured",
                    "Transparency": 0.5
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}

This example uses two data sources in one scene: one primary data source for the 2D and 3D content, and one isolated outer diameter data source. That means the scene uses two distinct data sources against the maximum scene-level limit of ten.


29. Empty Template JSON

This template shows the full top-level structure with empty collections or placeholder values. Replace placeholders before use. Project.Name is shown as an empty string so the name entered by the user during upload will be used; set it to a non-empty value only when the Blueprint must enforce a fixed project naming convention.

{
  "Header": {
    "Version": "1",
    "Metadata": {}
  },
  "Blueprint": {
    "Project": {
      "Id": "",
      "Name": "",
      "DataSources": [
        {
          "Id": "",
          "Type": "LAS2",
          "Configuration": {
            "Path": ""
          },
          "Labels": [
            {
              "CurveId": "",
              "Default": "",
              "Title": "",
              "Unit": ""
            }
          ]
        }
      ],
      "ColourMaps": [
        {
          "Id": "",
          "Name": "",
          "GradientSteps": [
            {
              "Offset": 0.0,
              "Colour": "#000000"
            },
            {
              "Offset": 1.0,
              "Colour": "#FFFFFF"
            }
          ]
        }
      ],
      "Scenes": [
        {
          "Id": "",
          "Name": "",
          "Ranges": {
            "Full": {
              "Min": 0.0,
              "Max": 0.0
            },
            "Starting": {
              "Min": 0.0,
              "Max": 0.0
            }
          },
          "Views": {
            "2D": {
              "Tracks": [
                {
                  "Id": "",
                  "Position": 1,
                  "DataSourceId": "",
                  "Data": {
                    "ReferenceCurves": [
                      {
                        "CurveId": "",
                        "DataReductionType": "Avg",
                        "MinScale": 0.0,
                        "MaxScale": 0.0,
                        "LineColour": "#000000",
                        "LineThickness": 1,
                        "LineStyle": "Solid"
                      }
                    ]
                  },
                  "Visible": true,
                  "Title": "",
                  "Subtitle": "",
                  "ProportionalWidth": 1,
                  "Statistics": {
                    "Include": [],
                    "Exclude": []
                  },
                  "CrossSection": {
                    "HighlightedCurve": {
                      "CurveId": "",
                      "Colour": "#000000",
                      "DataReductionType": "Avg",
                      "MinScale": 0.0,
                      "MaxScale": 0.0
                    },
                    "Curves": [
                      {
                        "CurveId": "",
                        "Colour": "#000000",
                        "IndexRange": "ALL",
                        "DataReductionType": "Avg"
                      }
                    ]
                  }
                }
              ]
            },
            "3D": {
              "DataReductionType": "Avg",
              "TrackId": "",
              "Markup": {
                "Axes": {
                  "InlineAxesHelperVisible": true,
                  "MiniAxesHelperVisible": true
                },
                "PositionIndicator": {
                  "Type": "Crosshair",
                  "IndicatorLabelsVisible": true
                },
                "Labels": {
                  "Channels": "None",
                  "Depth": "None"
                },
                "ColourScale": {
                  "Visible": true
                }
              },
              "Display": {
                "Mode": "Textured",
                "Transform": {
                  "Scale": {
                    "XY": 1.0,
                    "Z": 1.0
                  },
                  "Rotate": {
                    "X": 0,
                    "Y": 0,
                    "Z": 0
                  }
                },
                "Cutaway": {
                  "Enabled": false,
                  "StartChannelNumber": 1
                },
                "DriftTool": {
                  "Visible": false,
                  "Length": 1,
                  "TopDiameter": 1,
                  "BottomDiameter": 1,
                  "InlineOffset": 0,
                  "CrossLineOffset": 0
                },
                "TruePipeTrajectory": {
                  "Enabled": false,
                  "DeltaXCurveId": "",
                  "DeltaYCurveId": ""
                },
                "OuterDiameter": {
                  "Bound": {
                    "Visible": false,
                    "CurveId": "",
                    "Colour": "#00FF00",
                    "Transparency": 0.5,
                    "AddLogToValues": false
                  },
                  "Isolated": {
                    "Visible": false,
                    "DataSourceId": "",
                    "CurveId": "",
                    "DisplayMode": "Textured",
                    "Transparency": 0.5
                  }
                }
              }
            }
          }
        }
      ]
    }
  }
}

The empty template is a structural starting point only. Empty strings and zero-width ranges must be replaced with valid values before use.