harness.design JSON Format Reference (v1.3)
This document describes version 1.3 of the JSON format used by harness.design to represent electrical wire harness designs. It is the content of a .harness local file; a file matching this format opens in the app via Open → Local File, and the desktop app edits such files in place.
Views
The app has two canvas views:
- Schematic — a node-based logical wiring diagram. Electrical components are represented as rectangular nodes; wires and cable cores are edges connecting them.
- Layout — a node-based physical routing diagram. Components appear as nodes; bundles (groups of wires following a physical path) are edges between them.
Most components appear in both views. A few are exclusive to one view (e.g. Cables and TwistedWires are schematic-only; BranchPoints are layout-only).
Top-Level Structure
A harness document is a JSON object with a version field and optional arrays of components and parts. All array fields are omitted when empty — only include arrays that contain data.
A part library (a .harnesslib file) is the same object with "kind": "library", holding only currency and the part arrays: no components and no other settings.
{
"version": 1.3,
// Document settings (all optional — see defaults below)
"currency": "$",
"lengthUnit": "m",
"gaugeUnit": "Metric",
"readOnly": false,
"idNumbers": { "numbering": "CanvasPosition" },
// Electrical components (all optional arrays)
"wires": [],
"connectors": [],
"terminals": [],
"cables": [],
"twistedWires": [],
"diodes": [],
"resistors": [],
"splices": [],
"bundles": [],
"branchPoints": [],
"mates": [],
"schematicNotes": [],
"layoutNotes": [],
// Groups (optional — see Group)
"groups": [],
// Manufacturing parts (all optional arrays)
"wireParts": [],
"connectorParts": [],
"terminalParts": [],
"spliceParts": [],
"contactParts": [],
"cableParts": [],
"coveringParts": [],
"diodeParts": [],
"resistorParts": [],
"groupParts": [],
"lockParts": [],
"dustCoverParts": [],
"backshellParts": [],
"bootParts": [],
"cavitySealParts": [],
"cavityPlugParts": [],
"mountParts": []
}Defaults — these fields can be omitted if you want the default value:
| Field | Default | Omit when |
|---|---|---|
version | — | Never omit; always 1.3 |
kind | — | Only on a part library: "library". Absent on a harness |
currency | "$" | Using US dollars |
lengthUnit | "m" | Using meters |
gaugeUnit | "Metric" | Using metric gauge |
idNumbers | canvas position | Numbering IDs by canvas position (see below) |
readOnly | false | Document is editable |
schematic | width 150 | New connectors and terminals start at the standard width. { "connectorWidth"?, "terminalWidth"? } in px, a multiple of 30 from 60 to 360 (Harness Settings → Schematic) |
formboard | — | Formboard mode is off. Don’t add or remove it by hand: turn it on in Harness Settings → Formboard. Holds panelSize, panelOrientation, panelWidth, panelHeight, rows, columns, defaultCornerRadius and an optional annotationScale (0.25–2, default 1). Every formboard’s layout is drawn at 0.75 mm per layout unit |
ID Conventions
Every element has an id: string field. IDs must be unique across the entire document — no two elements of any type may share an ID. Use short descriptive strings or any consistent scheme you prefer (e.g. "conn_J1", "wire_1", "cav_A1").
IDs are internal only — they are never displayed to the user. They exist solely to cross-reference elements within the document (e.g. a wire’s source.id references a connector’s id; a connector’s partId references a ConnectorPart’s id).
Display IDs and Labels
The IDs users see in the app (C1, W3, S2, …) are not stored as ids. They are component IDs the app works out from each component’s type and number.
How they are numbered is set by the optional top-level idNumbers object (Harness Settings → Component IDs):
| Field | Type | Description |
|---|---|---|
numbering | string | "CanvasPosition" (default when omitted): numbered by position on the canvas. "Static": each component keeps its number |
lastIdNumbers | object | Static numbering only: the last number given out for each component type (e.g. { "connectors": 4, "wires": 12 }) |
Under static numbering, connectors, terminals, wires, cables, twisted wires, splices, diodes, resistors, bundles and branch points carry an idNumber (the 3 in C3). The app assigns it: omit idNumber on components you add by hand and leave existing ones unchanged.
Connectors, terminals, splices, diodes, resistors, cables, twisted wires and branch points may also have a label: the user’s name for the component, shown in place of its display ID wherever it is named. A label never changes the id or the display ID.
Canvas Positions
Both canvas views use a 30-unit grid. All positions should be multiples of 30 (e.g. { "x": 90, "y": 210 }).
Elements carry position fields depending on which views they appear in:
- SchematicElement — has
schematicPosition: { x, y }(schematic only; e.g. Cable, TwistedWires, SchematicNote) - LayoutElement — has
layoutPosition: { x, y }(layout only; e.g. BranchPoint, LayoutNote) - CrossFlowElement — has
schematicPosition?: { x, y }andlayoutPosition?: { x, y }(always present in both views; e.g. Connector, Terminal, Splice, Diode, Resistor)
Important for CrossFlowElements: these elements always appear in both the schematic and layout views regardless of which position fields are defined. If only one position is provided, it is used for both views. At least one position must be defined.
Node Sizes
Positions define the top-left corner of a node. Use the sizes below to avoid overlaps. All values are in grid units (1 unit = 30 px). N = number of cavities/cores/wires; w = the element’s width property (default 150 for Connector and Terminal).
Schematic view (non-rotated):
| Element | Width | Height |
|---|---|---|
| Connector | w | 30 + N_cavities × 30 [+ 30 if shell] |
| Terminal | w | 30 |
| Cable | 60 | 30 + N_cores × 30 [+ 30 if shield] |
| TwistedWires | 90 | 30 + N_wires × 30 |
| Splice / Diode / Resistor | 30 | 30 |
When rotated: true, width and height swap (the node is transposed).
Layout view — every node (Connector, Terminal, BranchPoint, Splice, Diode, Resistor) is 30 × 30.
Layout Guidelines
General:
- Nodes must not overlap. Account for each node’s full width and height when placing neighbours.
- Leave at least 60–90 units of clear space between nodes so that wires and cable cores have room to run between them without crossing through a node.
- Avoid placing layout points (waypoints) on wires unless absolutely necessary. The app has limited auto-routing that works better than poorly placed waypoints. When waypoints are needed to route around a node, keep them to the minimum required.
Schematic view:
- A practical arrangement is to place endpoint components (Connectors, Terminals) around the perimeter of a rectangle and leave the interior empty. Non-rotated nodes sit on the left and right edges with wires exiting horizontally; rotated nodes sit on the top and bottom edges with wires exiting vertically.
- Inline components (Splices, Diodes, Resistors, Cables, TwistedWires) go in the open space in the centre, where the wires naturally pass through.
- This perimeter layout keeps all connections in the open interior and minimises crossings without needing waypoints.
Layout view:
- Component positions should approximately match the real physical locations of the parts in the harness — e.g. a connector mounted at the front of a vehicle should be on the left, one at the rear on the right.
- BranchPoints mark where the harness trunk physically splits; place them where the bundle routes diverge.
- Inline components with a
locationId(Splices, Diodes, Resistors) should be placed close to their location element — the app draws an arrow from the inline component to its location, so large distances look cluttered.
Connection Model
Wires are the core of the harness — they define which element endpoints are electrically connected. A Wire has source and target, each a ConnectionPoint:
{
"id": "wire_1",
"source": { "id": "element_id", "handle": "handle_string" },
"target": { "id": "element_id", "handle": "handle_string" },
"color": "Red"
}What id and handle Reference
id — the id of the element being connected to. Valid target elements for a wire are: Connector, Terminal, Splice, Diode, Resistor.
handle — depends on the element type:
| Target element | handle value |
|---|---|
| Connector cavity | The id of the specific Cavity within the connector’s cavities array |
| Connector shell | The id of the connector’s shell cavity |
| Terminal | "Terminal" |
| Splice | "Splice" |
| Diode | "Left" or "Right" |
| Resistor | "Left" or "Right" |
Example — a wire from a connector cavity to a terminal:
{
"id": "w1",
"source": { "id": "J1", "handle": "cav_1" },
"target": { "id": "term_1", "handle": "Terminal" },
"color": "Red"
}Components
Wire
Represents a single conductor connecting two elements. The wire’s color and stripeColor should match the assigned WirePart’s color properties when a partId is set.
{
"id": "w1",
"source": { "id": "J1", "handle": "cav_1" },
"target": { "id": "J2", "handle": "cav_a" },
"color": "Red",
"stripeColor": "White",
"identColors": ["Blue"],
"identLabel": "12V",
"partId": "wp1",
"excludeFromBom": false,
"layoutPoints": [{ "id": "lp1", "schematicPosition": { "x": 300, "y": 210 } }]
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
source | ConnectionPoint | Yes | Start of the wire |
target | ConnectionPoint | Yes | End of the wire |
color | PartColor | Yes | Wire insulation color — must match the assigned WirePart’s color if partId is set |
stripeColor | PartColor | No | Stripe color — must match the assigned WirePart’s stripeColor if set |
identColors | PartColor[] | No | Additional identification color bands |
identLabel | string | No | Text identification label |
partId | string | No | ID of a WirePart in wireParts |
excludeFromBom | boolean | No | Exclude from bill of materials |
layoutPoints | array | No | Waypoints that shape the wire’s path in the schematic view |
Connector
A housing with one or more cavities. This is the most common element — it represents a physical connector into which contacts/terminals are inserted.
In the schematic, a connector is displayed as a vertical node (when not rotated) with a 30-unit header, then each cavity occupying 30 units vertically. The shell cavity (if present) is always at the bottom. When rotated, the layout is horizontal: header on the left, cavities going right, shell at the far right. Wires exit left/right when not rotated, or top/bottom when rotated. Setting width controls the horizontal width of the node; when rotated, width becomes the height.
{
"id": "J1",
"label": "J1",
"schematicPosition": { "x": 90, "y": 210 },
"layoutPosition": { "x": 480, "y": 300 },
"cavities": [
{ "id": "cav_1", "signal": "PWR", "contactPartId": "cp1" },
{ "id": "cav_2", "signal": "GND" },
{ "id": "cav_3" }
],
"shell": { "id": "shell_1" },
"width": 90,
"rotated": false,
"partId": "conn_part_1",
"configurationId": "cfg1",
"excludeFromBom": false
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The connector’s name, shown on the connector node and in place of its display ID (e.g. "ECU", "P2") |
schematicPosition | {x, y} | At least one position required | Position in schematic view (multiple of 30) |
layoutPosition | {x, y} | At least one position required | Position in layout view (multiple of 30) |
cavities | Cavity[] | Yes | List of cavities (connection points for wires) |
shell | Cavity | No | Shell/shield cavity — always rendered at bottom (or right when rotated) |
width | number | No | Display width in schematic, in px: a multiple of 30 from 60 to 360 (default 150). Becomes height when rotated. |
rotated | boolean | No | Schematic orientation only. When true, wires exit top/bottom and cavities run horizontally. |
partId | string | No | ID of a ConnectorPart in connectorParts |
configurationId | string | No | ID of a PartConfiguration within the assigned ConnectorPart’s configurations array (defaults to the first) |
excludeFromBom | boolean | No | Exclude from BOM |
Cavity
A cavity is a single slot in a connector. Wires connect to a connector by referencing the cavity’s id as the handle.
{ "id": "cav_1", "signal": "12V_MAIN", "contactPartId": "cp1" }| Field | Type | Description |
|---|---|---|
id | string | Unique ID — used as the handle when wiring to this cavity |
signal | string | Signal name (e.g. "PWR", "GND", "CAN_H"). Signals propagate through the net, so you only need to define it once per net — at the point where the signal originates. Other cavities on the same net will inherit it. Set a signal explicitly on a cavity only when it needs a unique label that differs from what would be inherited. |
propagate | boolean | Set to false to prevent this cavity’s signal from propagating further along the net |
global | boolean | Whether this is a global signal (shared across all elements with the same signal name) |
cavityPlugPartId | string | ID of a CavityPlugPart assigned to this specific cavity (overrides configuration default; never set together with contactPartId) |
contactPartId | string | ID of a ContactPart assigned to this specific cavity (overrides configuration default) |
cavitySealPartId | string | null | ID of a CavitySealPart fitted in this specific cavity (overrides the configuration’s seal; null = no seal). Independent of contactPartId / cavityPlugPartId |
Terminal
A standalone terminal fitting (Ferrule, Ring, Spade, etc.) used at wire endpoints. Wires connect to terminals using "Terminal" as the handle.
{
"id": "term_1",
"type": "Ferrule",
"schematicPosition": { "x": 210, "y": 210 },
"layoutPosition": { "x": 600, "y": 300 },
"signal": "GND",
"width": 90,
"rotated": false,
"partId": "tp1",
"configurationId": "tp1_cfg_hs",
"excludeFromBom": false
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The user’s name for the terminal, shown in place of its display ID (e.g. "Chassis GND") |
type | TerminalType | Yes | Terminal type (see TerminalType) |
schematicPosition | {x, y} | At least one position required | Position in schematic view |
layoutPosition | {x, y} | At least one position required | Position in layout view |
signal | string | No | Signal name |
width | number | No | Display width in px, a multiple of 30 from 60 to 360 (becomes height when rotated) |
rotated | boolean | No | Schematic orientation only — wires exit top/bottom when true |
partId | string | No | ID of a TerminalPart in terminalParts |
configurationId | string | No | ID of a PartConfiguration in the TerminalPart’s configurations (defaults to the first) |
excludeFromBom | boolean | No | Exclude from BOM |
Splice
An inline junction that joins multiple wires at a single point. Wires connect using "Splice" as the handle.
{
"id": "spl_1",
"schematicPosition": { "x": 390, "y": 210 },
"layoutPosition": { "x": 780, "y": 300 },
"locationId": "J1",
"partId": "sp1",
"excludeFromBom": false
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The user’s name for the splice, shown in place of its display ID (e.g. "GND FRONT") |
schematicPosition | {x, y} | At least one position required | Position in schematic view |
layoutPosition | {x, y} | At least one position required | Position in layout view |
locationId | string | No | ID of a Connector, Terminal, or BranchPoint indicating where in the physical harness this splice sits. If omitted, the position is calculated automatically to minimise wire lengths — recommended to leave undefined for LLM-generated harnesses. |
partId | string | No | ID of a SplicePart in spliceParts |
configurationId | string | No | ID of a PartConfiguration in the SplicePart’s configurations (defaults to the first) |
excludeFromBom | boolean | No | Exclude from BOM |
Diode
An inline diode placed in series with a wire. Wires connect using "Left" or "Right" as the handle.
{
"id": "d1",
"schematicPosition": { "x": 390, "y": 300 },
"layoutPosition": { "x": 690, "y": 420 },
"anodeOnRight": false,
"rotated": false,
"locationId": "J1",
"partId": "dp1",
"excludeFromBom": false
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The user’s name for the diode, shown in place of its display ID (e.g. "Flyback") |
schematicPosition | {x, y} | At least one position required | Position in schematic view |
layoutPosition | {x, y} | At least one position required | Position in layout view |
anodeOnRight | boolean | No | When true, anode is on the right side (default: anode on left) |
rotated | boolean | No | Schematic orientation only — wires exit top/bottom when true |
locationId | string | No | ID of a Connector, Terminal, or BranchPoint for physical placement. Usually omitted. |
partId | string | No | ID of a DiodePart in diodeParts |
configurationId | string | No | ID of a PartConfiguration in the DiodePart’s configurations (defaults to the first) |
excludeFromBom | boolean | No | Exclude from BOM |
Resistor
An inline resistor placed in series with a wire. Wires connect using "Left" or "Right" as the handle. Fields are identical to Diode minus anodeOnRight.
{
"id": "r1",
"schematicPosition": { "x": 390, "y": 420 },
"rotated": false,
"locationId": "J1",
"partId": "rp1"
}Cable
A multi-conductor sheathed assembly. Cables appear in the schematic view only. The cable node sits centrally between the elements its cores connect — similar to a TwistedWires node. Each core is a conductor with its own source and target connection points.
{
"id": "cab1",
"schematicPosition": { "x": 390, "y": 210 },
"rotated": false,
"partId": "cablePart1",
"cores": [
{
"id": "core_1",
"color": "Red",
"source": { "id": "J1", "handle": "cav_1" },
"target": { "id": "J2", "handle": "cav_a" }
},
{
"id": "core_2",
"color": "Black",
"stripeColor": "White",
"source": { "id": "J1", "handle": "cav_2" },
"target": { "id": "J2", "handle": "cav_b" }
}
],
"shield": {
"id": "shield_1",
"color": "Shield",
"source": { "id": "spl_gnd", "handle": "Splice" }
}
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The user’s name for the cable, shown in place of its display ID (e.g. "Sensor") |
schematicPosition | {x, y} | Yes | Position of the cable node in the schematic |
rotated | boolean | No | Schematic orientation only |
partId | string | No | ID of a CablePart in cableParts |
cores | CableCore[] | Yes | The individual conductors |
shield | CableCore | No | Shield/drain wire — may connect to only one endpoint (target can be omitted) |
CableCore
Cable cores get their color and gauge properties from the parent CablePart — they do not have their own partId. The color and stripeColor fields on the core should match the corresponding CableCorePart in the assigned CablePart.
| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
color | PartColor | Yes | Conductor color |
stripeColor | PartColor | No | Stripe color |
identColors | PartColor[] | No | Additional identification colors |
identLabel | string | No | Text identification label |
source | ConnectionPoint | No | One end — same handle rules as Connection Model |
target | ConnectionPoint | No | Other end (can be omitted for shield cores with only one connection) |
sourceLayoutPoints | array | No | Layout waypoints on the source-side path |
targetLayoutPoints | array | No | Layout waypoints on the target-side path |
TwistedWires
Two or more wires (up to 8) twisted together, represented as a single schematic node with a central position. The node sits between the elements its wires connect — similar to a Cable node. Each inner wire has its own source and target connections using the same handle rules as regular wires.
{
"id": "tw1",
"schematicPosition": { "x": 390, "y": 210 },
"rotated": false,
"wires": [
{
"id": "tw_w1",
"color": "Blue",
"source": { "id": "J1", "handle": "cav_1" },
"target": { "id": "J2", "handle": "cav_a" },
"partId": "wp1"
},
{
"id": "tw_w2",
"color": "White",
"stripeColor": "Blue",
"source": { "id": "J1", "handle": "cav_2" },
"target": { "id": "J2", "handle": "cav_b" },
"partId": "wp1"
}
]
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The user’s name for the twisted wires, shown in place of their display ID (e.g. "CAN") |
schematicPosition | {x, y} | Yes | Position of the node in the schematic |
rotated | boolean | No | Schematic orientation only |
wires | SplitWire[] | Yes | The twisted conductors (2–8 wires) |
Each wire inside wires supports: id, color, stripeColor, identColors, identLabel, source, target, partId, excludeFromBom. The color/stripeColor should match the assigned WirePart if partId is set.
Bundle
Represents a physical routing path between two elements in the layout view. Bundles define the route that grouped wires follow through the physical harness.
{
"id": "bun1",
"sourceId": "J1",
"targetId": "J2",
"length": { "value": 250, "unit": "mm" },
"label": "Main Trunk",
"labelColor": "Black",
"partIds": ["cov1"],
"layoutPoints": [{ "id": "blp1", "layoutPosition": { "x": 600, "y": 330 } }]
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
sourceId | string | Yes | ID of a Connector, Terminal, or BranchPoint |
targetId | string | Yes | ID of a Connector, Terminal, or BranchPoint |
length | {value, unit} | No | Physical length of this bundle segment |
label | string | No | Label displayed on the bundle in layout view |
labelColor | PartColor | No | Color of the label text |
separateLabels | boolean | No | Show a different label at each end: label/labelColor at the source end, endLabel/endLabelColor at the target end |
middleLabel | boolean | No | Show label/labelColor once, in the middle of the bundle, instead of at its ends. With separateLabels too, label both ends and the middle (midLabel/midLabelColor) |
endLabel | string | No | Label at the target end (with separateLabels) |
endLabelColor | PartColor | No | Color of the end label (with separateLabels) |
midLabel | string | No | Label in the middle of the bundle (with both separateLabels and middleLabel) |
midLabelColor | PartColor | No | Color of the middle label (with both separateLabels and middleLabel) |
partIds | string[] | No | IDs of the CoveringParts over this bundle. A part listed twice counts twice; a cut-to-length covering takes the bundle’s length in the BOM |
layoutPoints | BundleLayoutPoint[] | No | Waypoints shaping the bundle’s route |
BranchPoint
A junction in the physical layout where bundles split or join. Appears in the layout view only.
{
"id": "bp1",
"layoutPosition": { "x": 690, "y": 390 },
"partIds": ["boot1", "cov2"]
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
label | string | No | The user’s name for the branch point, shown in place of its display ID (e.g. "Firewall") |
layoutPosition | {x, y} | Yes | Position in layout view |
partIds | string[] | No | IDs of BootParts (protective boots over the junction) and CoveringParts, any number of each |
Mate
Represents a physical mating between two connectors, two terminals, or a terminal and a connector in the layout view.
Connector-to-connector mate:
{ "id": "m1", "sourceId": "J1", "targetId": "J2" }Terminal-to-connector mate (must specify which cavity):
{ "id": "m2", "sourceId": "term_1", "targetId": "J1", "targetCavityId": "cav_3" }Terminal-to-terminal mate:
{ "id": "m3", "sourceId": "term_1", "targetId": "term_2" }| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID |
sourceId | string | Yes | ID of the first connector or terminal |
targetId | string | Yes | ID of the second connector or terminal |
targetCavityId | string | Required when mating a terminal to a connector | The cavity id the terminal mates into |
Group
A named grouping box that owns a set of components — everything belonging to a module, or the harness-side connectors of an external device. A group holds its members as an embedded document, and the format is fully recursive (groups can contain groups). Member elements live inside the entry’s document with group-local ids; the editor qualifies them at load time as <groupId>-<localId> (recursively for nesting), which is how references from outside the entry address them (see the boundary rules below).
{
"id": "g1",
"name": "Front Harness",
"document": {
"connectors": [{ "id": "J1", "cavities": [{ "id": "c1" }], "schematicPosition": { "x": 0, "y": 0 } }]
}
}| Field | Type | Required | Description |
|---|---|---|---|
id | string | Yes | Unique ID; alphanumeric only (no - or _) — it prefixes member ids |
name | string | No | Display name |
locked | boolean | No | User-set read-only lock on the contents |
views | string | No | "Schematic", "Layout", or "Both" (default) — where the group shows |
collapsedSchematic | boolean | No | Contents hidden in the schematic view |
collapsedLayout | boolean | No | Contents hidden in the layout view |
partId | string | No | ID of a GroupPart (Group Part) representing the whole group |
excludeFromBom | boolean | No | Exclude the assigned group part from the BOM |
link | object | No | Link to the source document for an embedded harness (see GroupLink below) |
document | object | Yes | Embedded document: the component arrays above plus nested groups |
Groups have no position fields — the box is derived from its members.
Boundary rules. A connection-like element (wire, mate, bundle, cable, twisted wires) belongs inside the entry’s document only when all of its endpoints are inside; anything crossing the boundary belongs to the containing document, referencing the member with its qualified id (e.g. "g1-J1" / handle "g1-c1"). A conductor (cable core / twisted wire) inside an entry never references outside it — the app homes a cable or twisted wires to the nearest common ancestor of everything it connects, exactly like splices and branch points. An ordinary (unlinked) group carries no part arrays — its components reference the root document’s parts by plain part id (part ids are never qualified). A linked group is the exception: its document also embeds the source harness’s part arrays as an isolated library, and its components reference those.
link. A group with a link is a linked group: an embedded copy of another harness document that the app keeps in sync with its source (see the Embed feature). Its contents are read-only in the editor and are replaced wholesale on refresh, so hand-editing inside a linked group’s document is not recommended — create and refresh links in the app instead.
{ "source": "cloud", "documentId": "12345", "shortId": "aB3x", "sourceUpdatedAt": "2026-08-30T12:00:00.000Z" }| Field | Type | Description |
|---|---|---|
source | string | "cloud" (a harness.design document) or "file" (a local .harness file, desktop app) |
documentId | string | Cloud: the source document’s id |
shortId | string | Cloud: the source document’s URL-friendly id |
relativePath | string | File: the source file’s path relative to this document’s file (POSIX separators) |
sourceUpdatedAt | string | Freshness baseline — cloud updated_at timestamp, or the file’s mtime in ms |
SchematicNote / LayoutNote
Free text annotations. SchematicNote appears in the schematic view only; LayoutNote in the layout view only.
{
"id": "note_1",
"text": "High voltage section — handle with care",
"schematicPosition": { "x": 300, "y": 90 },
"color": "Yellow",
"width": 150,
"alignment": "Left",
"verticalAlignment": "Top"
}| Field | Type | Description |
|---|---|---|
id | string | Unique ID |
text | string | Note content |
schematicPosition / layoutPosition | {x, y} | Position in the respective view |
color | PartColor | Background/accent color |
width | number | Display width in px, a multiple of 30 from 60 to 360 |
alignment | NoteTextAlignment | "Left", "Center", or "Right" |
verticalAlignment | NoteVerticalAlignment | "Top", "Middle", or "Bottom" |
Parts
Parts are the actual manufacturing components. They live in their own arrays (wireParts, connectorParts, etc.) and are referenced by electrical components via partId.
Common Part Fields
All parts share these base fields:
| Field | Type | Description |
|---|---|---|
id | string | Unique ID — referenced by components via partId |
partNumber | string | Manufacturer part number |
manufacturer | string | Manufacturer name |
description | string | Human-readable description |
url | string | Datasheet or product URL |
color | PartColor | Part color (for visual display) |
Parts that have a unit price add:
| Field | Type | Description |
|---|---|---|
price | number | Price per unit |
Parts that are priced by length add:
| Field | Type | Description |
|---|---|---|
pricePerLength | {price, unit} | Price per unit of length |
Parts with gauge constraints add:
| Field | Type | Description |
|---|---|---|
minGauge | {value, unit} | Minimum compatible wire gauge |
maxGauge | {value, unit} | Maximum compatible wire gauge |
ConnectorPart
{
"id": "cp1",
"partNumber": "1-123456-1",
"manufacturer": "TE Connectivity",
"description": "2-pin housing, female",
"gender": "Female",
"numberOfCavities": 2,
"hasShell": false,
"designationStrategy": { "type": "sequential" },
"configurations": [
{
"id": "cfg_default",
"accessories": [
{ "id": "a1", "type": "LockPart", "partId": "lp1" },
{ "id": "a2", "type": "ContactPart", "partId": "cont1" },
{ "id": "a3", "type": "CavityPlugPart", "partId": "plug1" }
]
},
{
"id": "cfg_with_backshell",
"name": "With Backshell",
"accessories": [
{ "id": "b1", "type": "BackshellPart", "partId": "bs1" },
{
"id": "b2",
"type": "ContactPart",
"partId": "cont_heavy",
"rule": { "minGauge": { "value": 16, "unit": "AWG" } }
},
{ "id": "b3", "type": "ContactPart", "partId": "cont1" }
]
}
],
"price": 1.25
}| Field | Type | Description |
|---|---|---|
gender | ConnectorGender | "Male" or "Female". Can be omitted for connectors with no gender (e.g. neutral housings). |
numberOfCavities | number | Total cavity count |
hasShell | boolean | Whether the connector has a shell/shield cavity |
designationStrategy | CavityDesignationStrategy | How cavity positions are labelled in the UI |
configurations | PartConfiguration[] | Available hardware configurations (see PartConfiguration) |
CavityDesignationStrategy
Controls how cavity positions are labelled in the UI (does not affect IDs):
{ "type": "sequential" }
{ "type": "alphabetical", "skippedLetters": ["I", "O"] }
{ "type": "custom", "labels": ["A1", "B1", "A2", "B2"] }
{
"type": "grid",
"rows": 2,
"columns": 3,
"rowLabels": { "type": "alphabetical" },
"columnLabels": { "type": "sequential" }
}PartConfiguration
Defines a set of accessories that go with a part. ConnectorPart, TerminalPart, SplicePart, DiodePart and ResistorPart all have configurations. The first configuration is the default and is applied automatically — its name should be left blank. Additional configurations can have names; a component selects one with its configurationId.
A connector part’s configurations take every accessory type below. A terminal, splice, diode or resistor part’s configurations take only BootPart and CoveringPart.
| Field | Type | Description |
|---|---|---|
id | string | Unique ID — referenced by the component’s configurationId |
name | string | Configuration name. Leave blank for the first (default) configuration. |
accessories | ConfigurationAccessory[] | The configuration’s parts, in order |
ConfigurationAccessory
One part in a configuration. Locks, dust covers, backshells, boots, mounts and coverings count once per component each (list a part twice for two); a cut-to-length covering gets no length here, so coverings in configurations are normally fixed-length. A covering in a configuration applies to every component using that configuration. Contacts and cavity plugs load into the connector’s cavities: each cavity without its own contactPartId / cavityPlugPartId takes the first contact or plug in the list whose rule it matches. Cavity seals are matched separately in the same way: each cavity without its own cavitySealPartId also takes the first seal whose rule it matches.
| Field | Type | Description |
|---|---|---|
id | string | Unique within the configuration |
type | string | "LockPart", "DustCoverPart", "BackshellPart", "BootPart", "MountPart", "CoveringPart", "ContactPart", "CavityPlugPart" or "CavitySealPart" |
partId | string | ID of a part of that type. Omitted for a slot that hasn’t been filled yet. |
rule | CavityPartRule | Contacts, cavity plugs and cavity seals only. Omit it for a contact or seal that loads into every connected cavity, or a plug for every unconnected one. |
CavityPartRule
Every condition that is set must hold for the part to load into a cavity.
| Field | Type | Description |
|---|---|---|
apply | string | "connected" (cavities with a wire or mate; the contact and seal default), "unconnected" (the cavity plug default) or "never" (kept in the configuration but never loaded automatically) |
cavitySizes | CavitySize[] | Only cavities of these sizes in the connector part’s pinout. A CavitySize is { "size": 1.6 } for a round cavity (diameter in mm) or { "shape": "rect", "size": 2.8, "height": 0.8 }. |
minGauge / maxGauge | {value, unit} | Contacts and plugs, "connected" rules only: the combined gauge of every conductor ending in the cavity must lie in this range. minGauge is the thinnest (in AWG, the larger number). A cavity whose wires have no gauge never matches a range. |
gaugeFromPart | boolean | Contacts only, "connected" rules: true uses the contact part’s own minGauge / maxGauge as the range |
minWireDiameter / maxWireDiameter | {value, unit} | Cavity seals only, "connected" rules: the cavity must hold one wire whose outside diameter lies in this range |
wireDiameterFromPart | boolean | Cavity seals only: true uses the seal part’s own minWireDiameter / maxWireDiameter |
contactPartIds | string[] | Cavity seals only: only cavities loaded with one of these contact parts |
WirePart
{
"id": "wp1",
"partNumber": "GXL-18-RD",
"manufacturer": "Belden",
"color": "Red",
"stripeColor": "White",
"gauge": { "value": 18, "unit": "AWG" },
"pricePerLength": { "price": 0.15, "unit": "m" }
}| Field | Type | Required | Description |
|---|---|---|---|
color | PartColor | Yes | Wire insulation color |
stripeColor | PartColor | No | Stripe color |
gauge | {value, unit} | No | Wire gauge (e.g. {"value": 18, "unit": "AWG"}) |
pricePerLength | {price, unit} | No | Price per length unit |
TerminalPart
{
"id": "tp1",
"partNumber": "3240102",
"manufacturer": "Molex",
"type": "Ferrule",
"size": { "value": 1.0, "unit": "mm" },
"minGauge": { "value": 18, "unit": "AWG" },
"maxGauge": { "value": 22, "unit": "AWG" },
"price": 0.3,
"configurations": [
{ "id": "tp1_cfg_default" },
{
"id": "tp1_cfg_hs",
"name": "With heat shrink",
"accessories": [{ "id": "a1", "type": "CoveringPart", "partId": "cov_hs" }]
}
]
}| Field | Type | Required | Description |
|---|---|---|---|
type | TerminalType | Yes | Terminal type — see TerminalType |
size | {value, unit} or string | No | Physical size specification |
minGauge / maxGauge | {value, unit} | No | Gauge compatibility range |
configurations | PartConfiguration[] | No | Boots and coverings that go with the part — see PartConfiguration |
SplicePart
{
"id": "sp1",
"partNumber": "SRMAD2S2022Q",
"manufacturer": "3M",
"minGauge": { "value": 20, "unit": "AWG" },
"maxGauge": { "value": 22, "unit": "AWG" },
"price": 0.25
}SplicePart, DiodePart and ResistorPart can also have configurations of boots and coverings, like TerminalPart.
ContactPart
A pin or socket inserted into a connector cavity.
{
"id": "cont1",
"partNumber": "170031-1",
"manufacturer": "TE Connectivity",
"gender": "Pin",
"type": "Crimp",
"minGauge": { "value": 18, "unit": "AWG" },
"maxGauge": { "value": 22, "unit": "AWG" },
"price": 0.45
}| Field | Type | Description |
|---|---|---|
gender | ContactGender | "Pin" (male) or "Socket" (female) |
type | ContactType | "Crimp", "Solder", or "Other" |
contactColor | ContactColor | Plating: "Silver", or omit for gold (the default) |
CoveringPart
Protective coverings (heat shrink, tubing, tape, etc.). A covering is listed in a bundle’s or branch point’s partIds, or as an accessory in a part’s configuration to cover connectors, terminals, splices, diodes and resistors.
{
"id": "cov1",
"partNumber": "EPS200-1/4",
"manufacturer": "Raychem",
"type": "HeatShrink",
"minDiameter": { "value": 3, "unit": "mm" },
"maxDiameter": { "value": 9, "unit": "mm" },
"isFixedLength": false,
"pricePerLength": { "price": 0.5, "unit": "m" }
}| Field | Type | Description |
|---|---|---|
type | CoveringType | See CoveringType |
minDiameter | {value, unit} | Minimum recoverable diameter |
maxDiameter | {value, unit} | Maximum diameter before recovery |
isFixedLength | boolean | Whether this covering comes in fixed lengths |
length | {value, unit} | Fixed length, if isFixedLength is true |
DiodePart
{
"id": "dp1",
"partNumber": "1N4007",
"manufacturer": "ON Semi",
"voltage": 1000,
"voltageUnit": "V",
"current": 1,
"currentUnit": "A",
"price": 0.1
}ResistorPart
{
"id": "rp1",
"partNumber": "CFR-25JB-100R",
"manufacturer": "Yageo",
"resistance": 100,
"resistanceUnit": "ohm",
"power": 0.25,
"powerUnit": "W",
"price": 0.05
}CablePart
{
"id": "cabpart1",
"partNumber": "CABLE-2C-18AWG",
"manufacturer": "Alpha Wire",
"shielded": false,
"cores": [
{ "id": "ccp1", "color": "Red", "gauge": { "value": 18, "unit": "AWG" } },
{ "id": "ccp2", "color": "Black", "gauge": { "value": 18, "unit": "AWG" } }
],
"pricePerLength": { "price": 1.2, "unit": "m" }
}| Field | Type | Description |
|---|---|---|
shielded | boolean | Whether the cable has an overall shield |
cores | CableCorePart[] | Specification for each conductor |
CableCorePart fields: id (required), color (required), stripeColor, gauge, twistedWithNext (true on a core twisted together with the next core in cores; consecutive flags form one twisted group, never set on the last core)
GroupPart, LockPart, DustCoverPart, BackshellPart, BootPart, MountPart, CavitySealPart, CavityPlugPart
These all share just the common part fields (id, partNumber, manufacturer, description, url, color, price). CavitySealPart also takes minWireDiameter / maxWireDiameter ({value, unit}), the outside diameters of the wires the seal fits:
{ "id": "fp1", "partNumber": "BK-2000", "manufacturer": "Acme", "price": 0.8 }Enums Reference
PartColor
"Black", "Brown", "Red", "Orange", "Yellow", "Green", "Blue", "Violet", "Gray", "White", "Pink", "Tan", "Maroon", "Light Yellow", "Light Green", "Light Blue", "Light Gray", "Transparent", "Shield"
TerminalType
"Ferrule", "Ring", "Spade", "QuickConnectMale", "QuickConnectFemale", "Loose"
LengthUnit
"mm", "cm", "m", "in", "ft", "yd"
GaugeUnit
"AWG", "Metric", "cmil", "kcmil"
Currency
"$", "€", "£", "¥", "₹"
ConnectorGender
"Male", "Female"
ContactGender
"Pin" (male), "Socket" (female)
ContactType
"Crimp", "Solder", "Other"
CoveringType
"HeatShrink", "CorrugatedTubing", "SpiralWrap", "Tape", "Tubing", "BraidedSleeve", "Other"
VoltageUnit
"mV", "V", "kV"
CurrentUnit
"mA", "A", "kA"
ResistanceUnit
"mohm", "ohm", "kohm", "Mohm"
PowerUnit
"mW", "W", "kW"
Key Rules Summary
versionmust be1.3— always include this field. Older files (1,1.1, …) are migrated automatically when opened.- All IDs must be unique across every element and part in the document. IDs are internal — never shown to the user.
- All positions are multiples of 30 — the canvas uses a 30-unit grid.
- CrossFlowElements require at least one position — connectors, terminals, splices, diodes, and resistors always appear in both views. If only one position is given, it is used for both views.
- Cavity IDs are the wire handle for connectors — use the cavity’s
idas thehandlein theConnectionPoint. - Handle values by element type: Terminal →
"Terminal", Splice →"Splice", Diode/Resistor →"Left"or"Right". - Wire color must match its part — when
partIdis set,colorandstripeColormust match theWirePart’s properties. - Cable cores have no partId — cores inherit properties from the parent
CablePart. - Empty arrays are omitted — only include arrays that contain data.
- Groups have no positions — the group box is derived from its members; member elements keep their normal canvas positions inside the group’s
document. locationIdon inline components is usually omitted — the app calculates the physical placement automatically, which is preferred for LLM-generated harnesses.
Complete Example
A real-world harness featuring connectors, terminals, a cable, twisted wires, a diode, a splice, bundles, branch points, a group, and a full parts library:
{
"version": 1.3,
"lengthUnit": "in",
"gaugeUnit": "AWG",
"wires": [
{
"id": "p4C0",
"color": "Black",
"partId": "hHJx",
"source": {
"id": "Lc1JP9-bnx1",
"handle": "Terminal"
},
"target": {
"id": "ldgd",
"handle": "Biby"
},
"layoutPoints": [
{
"id": "MI-a3z",
"schematicPosition": {
"x": 900,
"y": 870
}
},
{
"id": "dMu9K3",
"schematicPosition": {
"x": 900,
"y": 510
}
}
]
},
{
"id": "Sp2Z",
"color": "Pink",
"partId": "Ne4i",
"source": {
"id": "ldgd",
"handle": "JMcF"
},
"target": {
"id": "o-ob",
"handle": "xUsq"
}
},
{
"id": "DIgn",
"color": "Red",
"partId": "8F3f",
"source": {
"id": "DTn_",
"handle": "Splice"
},
"target": {
"id": "ldgd",
"handle": "sW2_"
}
},
{
"id": "OVWs",
"color": "Red",
"partId": "8F3f",
"source": {
"id": "DTn_",
"handle": "Splice"
},
"target": {
"id": "o-ob",
"handle": "MHZ6"
}
},
{
"id": "9tbL",
"color": "Orange",
"partId": "QNE-",
"source": {
"id": "EwNH",
"handle": "Left"
},
"target": {
"id": "Lc1JP9-rBx6",
"handle": "Terminal"
}
},
{
"id": "nBsJ",
"color": "Orange",
"partId": "QNE-",
"source": {
"id": "EwNH",
"handle": "Right"
},
"target": {
"id": "ldgd",
"handle": "znO-"
},
"layoutPoints": [
{
"id": "VN4kMD",
"schematicPosition": {
"x": 870,
"y": 780
}
},
{
"id": "A7AxD8",
"schematicPosition": {
"x": 870,
"y": 480
}
}
]
},
{
"id": "06kcze",
"color": "Red",
"partId": "8F3f",
"source": {
"id": "liFLYR",
"handle": "41zPJn"
},
"target": {
"id": "cwTybA",
"handle": "djD6l4"
}
},
{
"id": "5EumQx",
"color": "Violet",
"source": {
"id": "liFLYR",
"handle": "a_yeAK"
},
"target": {
"id": "cwTybA",
"handle": "oS2UCw"
}
},
{
"id": "e_Hlxl",
"color": "Brown",
"source": {
"id": "cwTybA",
"handle": "l56K30"
},
"target": {
"id": "liFLYR",
"handle": "vzai3X"
}
}
],
"connectors": [
{
"id": "o-ob",
"label": "Motor",
"partId": "bxk2",
"layoutPosition": {
"x": 420,
"y": 120
},
"schematicPosition": {
"x": 150,
"y": 210
},
"cavities": [
{
"id": "Yi-I",
"contactPartId": "OEl6"
},
{
"id": "Q6o7",
"contactPartId": "OEl6"
},
{
"id": "IYVR",
"contactPartId": "OEl6"
},
{
"id": "MHZ6",
"contactPartId": "TnIO"
},
{
"id": "xUsq",
"contactPartId": "TnIO"
}
]
},
{
"id": "ldgd",
"label": "Controller",
"partId": "0sF8",
"layoutPosition": {
"x": 1050,
"y": 210
},
"schematicPosition": {
"x": 990,
"y": 210
},
"cavities": [
{
"id": "RIrS",
"signal": "Phase U",
"contactPartId": "Dyod"
},
{
"id": "0B8m",
"signal": "Phase V",
"contactPartId": "Dyod"
},
{
"id": "XBxw",
"signal": "Phase W",
"contactPartId": "Dyod"
},
{
"id": "sW2_",
"signal": "5V",
"contactPartId": "EhjT"
},
{
"id": "JMcF",
"signal": "Temp",
"contactPartId": "EhjT"
},
{
"id": "LC63",
"signal": "SIG 1",
"contactPartId": "EhjT"
},
{
"id": "bKCz",
"signal": "GND",
"contactPartId": "EhjT"
},
{
"id": "dHl4",
"signal": "Shield",
"contactPartId": "Dyod"
},
{
"id": "znO-",
"signal": "Bat +",
"contactPartId": "Dyod"
},
{
"id": "Biby",
"signal": "Bat -"
}
]
},
{
"id": "ZuAT",
"label": "Inline",
"partId": "y2bR",
"layoutPosition": {
"x": 630,
"y": 300
},
"schematicPosition": {
"x": 360,
"y": 480
},
"cavities": [
{
"id": "XNv-",
"contactPartId": "TnIO"
},
{
"id": "iiqb",
"contactPartId": "TnIO"
},
{
"id": "SrNY23",
"contactPartId": "TnIO"
}
],
"shell": {
"id": "FcHPjV"
}
},
{
"id": "cwTybA",
"label": "Inline",
"partId": "5mSXoU",
"layoutPosition": {
"x": 510,
"y": 300
},
"schematicPosition": {
"x": 150,
"y": 480
},
"cavities": [
{
"id": "djD6l4",
"contactPartId": "GIEEsn"
},
{
"id": "oS2UCw",
"contactPartId": "GIEEsn"
},
{
"id": "l56K30",
"contactPartId": "GIEEsn"
}
],
"shell": {
"id": "FcHPjV"
}
},
{
"id": "liFLYR",
"label": "Throttle",
"partId": "6GcgSe",
"layoutPosition": {
"x": 420,
"y": 390
},
"schematicPosition": {
"x": -120,
"y": 480
},
"cavities": [
{
"id": "41zPJn"
},
{
"id": "a_yeAK"
},
{
"id": "vzai3X"
}
]
}
],
"cables": [
{
"id": "UKZX",
"schematicPosition": {
"x": 600,
"y": 480
},
"partId": "Vmtv",
"cores": [
{
"id": "Ul1z",
"color": "Red",
"source": {
"id": "ZuAT",
"handle": "XNv-"
},
"target": {
"id": "DTn_",
"handle": "Splice"
},
"targetLayoutPoints": [
{
"id": "M5Xe20",
"schematicPosition": {
"x": 720,
"y": 510
}
}
]
},
{
"id": "5ZSq",
"color": "Green",
"source": {
"id": "ZuAT",
"handle": "iiqb"
},
"target": {
"id": "ldgd",
"handle": "LC63"
},
"targetLayoutPoints": [
{
"id": "dM2iwy",
"schematicPosition": {
"x": 750,
"y": 540
}
},
{
"id": "kxRnaX",
"schematicPosition": {
"x": 750,
"y": 390
}
}
]
},
{
"id": "bt-Y",
"color": "Brown",
"source": {
"id": "ldgd",
"handle": "bKCz"
},
"target": {
"id": "ZuAT",
"handle": "SrNY23"
},
"sourceLayoutPoints": [
{
"id": "QkVtHS",
"schematicPosition": {
"x": 780,
"y": 570
}
},
{
"id": "JWo8zw",
"schematicPosition": {
"x": 780,
"y": 420
}
}
]
}
],
"shield": {
"id": "OP6H",
"color": "Shield",
"source": {
"id": "ldgd",
"handle": "dHl4"
},
"target": {
"id": "ZuAT",
"handle": "FcHPjV"
},
"sourceLayoutPoints": [
{
"id": "PO67hj",
"schematicPosition": {
"x": 810,
"y": 600
}
},
{
"id": "p2w1JZ",
"schematicPosition": {
"x": 810,
"y": 450
}
}
]
}
}
],
"twistedWires": [
{
"id": "6_u7IL",
"schematicPosition": {
"x": 570,
"y": 210
},
"wires": [
{
"id": "aIpnUw",
"color": "Blue",
"partId": "gIQ1",
"source": {
"id": "o-ob",
"handle": "Yi-I"
},
"target": {
"id": "ldgd",
"handle": "RIrS"
}
},
{
"id": "rYUBj5",
"color": "Yellow",
"partId": "8uqJ",
"source": {
"id": "o-ob",
"handle": "Q6o7"
},
"target": {
"id": "ldgd",
"handle": "0B8m"
}
},
{
"id": "h1xShz",
"color": "Green",
"partId": "9xdI",
"source": {
"id": "o-ob",
"handle": "IYVR"
},
"target": {
"id": "ldgd",
"handle": "XBxw"
}
}
]
}
],
"diodes": [
{
"id": "EwNH",
"partId": "SUc-",
"locationId": "nkXS",
"layoutPosition": {
"x": 870,
"y": 150
},
"schematicPosition": {
"x": 720,
"y": 780
}
}
],
"splices": [
{
"id": "DTn_",
"partId": "P3zw",
"locationId": "ldgd",
"layoutPosition": {
"x": 1050,
"y": 150
},
"schematicPosition": {
"x": 720,
"y": 330
}
}
],
"bundles": [
{
"id": "EG0l",
"length": {
"unit": "mm",
"value": 30
},
"sourceId": "ldgd",
"targetId": "nkXS"
},
{
"id": "un8Y",
"label": "Bat +",
"labelColor": "Red",
"sourceId": "Lc1JP9-rBx6",
"targetId": "Dd3Q"
},
{
"id": "l_jh",
"length": {
"unit": "mm",
"value": 120
},
"sourceId": "nkXS",
"targetId": "Dd3Q",
"layoutPoints": [
{
"id": "6uIMSf",
"layoutPosition": {
"x": 870,
"y": 360
}
}
]
},
{
"id": "OKbl",
"label": "BAT -",
"labelColor": "Black",
"sourceId": "Dd3Q",
"targetId": "Lc1JP9-bnx1"
},
{
"id": "DkaK",
"length": {
"unit": "mm",
"value": 200
},
"sourceId": "nkXS",
"targetId": "bNJD"
},
{
"id": "cllf",
"length": {
"unit": "mm",
"value": 80
},
"sourceId": "ZuAT",
"targetId": "bNJD"
},
{
"id": "KYU3",
"length": {
"unit": "mm",
"value": 150
},
"sourceId": "o-ob",
"targetId": "bNJD",
"layoutPoints": [
{
"id": "kp1Dh-",
"layoutPosition": {
"x": 690,
"y": 120
}
}
]
},
{
"id": "tjYiQr",
"sourceId": "liFLYR",
"targetId": "cwTybA",
"layoutPoints": [
{
"id": "oZk9-W",
"layoutPosition": {
"x": 420,
"y": 300
}
}
]
}
],
"mates": [
{
"id": "H0KRYm",
"sourceId": "cwTybA",
"targetId": "ZuAT"
}
],
"groups": [
{
"id": "Lc1JP9",
"name": "Battery",
"partId": "pvgRGG",
"document": {
"terminals": [
{
"id": "rBx6",
"type": "Ring",
"partId": "-xUh",
"signal": "14.8V",
"layoutPosition": {
"x": 1050,
"y": 330
},
"schematicPosition": {
"x": 360,
"y": 780
}
},
{
"id": "bnx1",
"type": "Ring",
"partId": "-xUh",
"signal": "GND",
"layoutPosition": {
"x": 1050,
"y": 390
},
"schematicPosition": {
"x": 360,
"y": 870
}
}
]
}
}
],
"branchPoints": [
{
"id": "nkXS",
"layoutPosition": {
"x": 870,
"y": 210
}
},
{
"id": "Dd3Q",
"layoutPosition": {
"x": 960,
"y": 360
}
},
{
"id": "bNJD",
"layoutPosition": {
"x": 750,
"y": 210
}
}
],
"wireParts": [
{
"id": "QNE-",
"color": "Orange",
"gauge": {
"unit": "AWG",
"value": 6
},
"partNumber": "GW0806ORG",
"manufacturer": "GeneralWire Tech"
},
{
"id": "hHJx",
"color": "Black",
"gauge": {
"unit": "AWG",
"value": 6
},
"partNumber": "GW0806BLK",
"manufacturer": "GeneralWire Tech"
},
{
"id": "8F3f",
"color": "Red",
"gauge": {
"unit": "AWG",
"value": 20
},
"partNumber": "GW0520RD",
"manufacturer": "GeneralWire Tech"
},
{
"id": "gIQ1",
"color": "Blue",
"gauge": {
"unit": "AWG",
"value": 6
},
"partNumber": "GW0806OBL",
"manufacturer": "GeneralWire Tech"
},
{
"id": "8uqJ",
"color": "Yellow",
"gauge": {
"unit": "AWG",
"value": 6
},
"partNumber": "GW0806YL",
"manufacturer": "GeneralWire Tech"
},
{
"id": "9xdI",
"color": "Green",
"gauge": {
"unit": "AWG",
"value": 6
},
"partNumber": "GW0806GRN",
"manufacturer": "GeneralWire Tech"
},
{
"id": "Ne4i",
"color": "Pink",
"gauge": {
"unit": "AWG",
"value": 20
},
"partNumber": "GW0520PK",
"manufacturer": "GeneralWire Tech"
}
],
"cableParts": [
{
"id": "Vmtv",
"color": "Black",
"shielded": true,
"partNumber": "GW0320-C",
"manufacturer": "GeneralWire Tech",
"cores": [
{
"id": "JHGl",
"color": "Red",
"gauge": {
"unit": "AWG",
"value": 20
}
},
{
"id": "Q1HA",
"color": "Green",
"gauge": {
"unit": "AWG",
"value": 20
}
},
{
"id": "na_E",
"color": "Brown",
"gauge": {
"unit": "AWG",
"value": 20
}
}
]
}
],
"diodeParts": [
{
"id": "SUc-",
"current": 6,
"voltage": 42,
"partNumber": "D483",
"manufacturer": "Universal Electric"
}
],
"spliceParts": [
{
"id": "P3zw",
"partNumber": "1867S-SCI",
"manufacturer": "StandCon Inc."
}
],
"contactParts": [
{
"id": "TnIO",
"type": "Crimp",
"gender": "Pin",
"maxGauge": {
"unit": "AWG",
"value": 16
},
"minGauge": {
"unit": "AWG",
"value": 20
},
"partNumber": "UEK-SM01",
"manufacturer": "Universal Electric"
},
{
"id": "OEl6",
"type": "Crimp",
"gender": "Pin",
"maxGauge": {
"unit": "AWG",
"value": 6
},
"minGauge": {
"unit": "AWG",
"value": 8
},
"partNumber": "UEK-SM04",
"manufacturer": "Universal Electric"
},
{
"id": "EhjT",
"type": "Crimp",
"gender": "Socket",
"maxGauge": {
"unit": "AWG",
"value": 18
},
"minGauge": {
"unit": "AWG",
"value": 22
},
"partNumber": "1822-PWS",
"manufacturer": "Power Link Ltd."
},
{
"id": "Dyod",
"type": "Crimp",
"gender": "Socket",
"maxGauge": {
"unit": "AWG",
"value": 6
},
"minGauge": {
"unit": "AWG",
"value": 8
},
"partNumber": "0608-PWS",
"manufacturer": "Power Link Ltd."
},
{
"id": "GIEEsn",
"type": "Crimp",
"gender": "Socket",
"maxGauge": {
"unit": "AWG",
"value": 16
},
"minGauge": {
"unit": "AWG",
"value": 20
},
"partNumber": "UEK-SF01",
"manufacturer": "Universal Electric"
}
],
"terminalParts": [
{
"id": "-xUh",
"size": {
"unit": "mm",
"value": 4
},
"type": "Ring",
"color": "Gray",
"maxGauge": {
"unit": "AWG",
"value": 6
},
"minGauge": {
"unit": "AWG",
"value": 8
},
"partNumber": "06R-SCI",
"manufacturer": "StandCon Inc."
}
],
"connectorParts": [
{
"id": "y2bR",
"color": "Blue",
"gender": "Female",
"hasShell": true,
"partNumber": "UEK04-04-S",
"manufacturer": "Universal Electric",
"numberOfCavities": 3
},
{
"id": "bxk2",
"color": "Blue",
"gender": "Male",
"partNumber": "UEK04-05",
"manufacturer": "Universal Electric",
"numberOfCavities": 5
},
{
"id": "0sF8",
"color": "Orange",
"gender": "Male",
"hasShell": false,
"partNumber": "PW-10-MK-06",
"manufacturer": "Power Link Ltd.",
"numberOfCavities": 10,
"designationStrategy": {
"type": "custom",
"labels": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
}
},
{
"id": "5mSXoU",
"color": "Blue",
"gender": "Male",
"hasShell": true,
"partNumber": "UEK04-03-S",
"manufacturer": "Universal Electric",
"numberOfCavities": 3
},
{
"id": "6GcgSe",
"url": "nexbridgeelectronics.fake/connectors/nexlock",
"color": "White",
"gender": "Male",
"partNumber": "NLK-3P-M-GY",
"description": "2.54 Male Connector",
"manufacturer": "Nexbridge Electronics Co.",
"numberOfCavities": 3
}
],
"groupParts": [
{
"id": "pvgRGG",
"url": "https://vortexpowersystems.fake/products/vpx-9400-4s",
"color": "Blue",
"partNumber": "VPX-9400 UltraCell 4S",
"description": "4S1P 14.8 V Li-Ion Battery",
"manufacturer": "Vortex Power Systems"
}
]
}