Skip to main content
← API reference

The order.v1 document

Every order the Configurator records is one signed order.v1 document: the workflow it was made in, the cut list, the production plan, the priced quote with its token, and where it came from. It carries no personal data, only your opaque customerRef.

Paths, field names, error codes, header names and code samples stay in English: they are the contract.

Rules that hold for every order

  • Every length is in millimetres; unit is only the display unit.
  • Every amount is Money in whole minor units, and every currency equals the order's currency.
  • One order is one workflow: workflow.mode selects the shape of the cut list and the plan (today panel2d).
  • plan.planHash is the SHA-256 of the canonical plan; the quote token binds it, so a changed plan is detected.
  • The document is closed and additive-only within v1: new fields are optional, nothing is removed or renamed.

Fields

The tables below are generated from the JSON Schema itself; the same schema is embedded, unchanged, in the OpenAPI document.

The descriptions in this table come from the English contract (the JSON Schema or the OpenAPI document).

Order

FieldTypeRequiredDescription
schemaVersion1yes—
idempotencyKeystringyesThe caller's replay key for POST /cfg/v1/order (P2-09): the same key returns the same order.
tenantIdstringyes—
configVersionintegeryesThe tenant-config snapshot this order was priced against. Capped at 2^53−1 (one JSON text per integer, so one hash / token claim per version).
workflowWorkflowyes—
customerRefstringnoOpaque reference into the merchant's own customer records. Never a name or an address.
customerGroupstringnoThe tenant-config customer group the price list was chosen for.
locale"en" | "de" | "it" | "fr" | "pl" | "cs" | "ro" | "hu" | "es" | "hr"yes—
unit"mm" | "cm" | "in"yesDisplay unit at ordering time; every length in this document is millimetres.
currencystringyes—
pricingMode"platform" | "external"yes—
createdAtstringyes—
expiresAtstringyesQuote validity; equals the token's exp.
sourceSourceyes—
cutListCutPart[]yesMODE-DISCRIMINATED by workflow.mode (Order.allOf). One branch today: panel2d CutPart.
fullSheetsFullSheetItem[]yesFull stock units bought uncut. MODE-DISCRIMINATED; panel2d: whole sheets.
hardwareHardwareLine[]yesMode-independent (catalogue hardware).
bondedPanelsBondedPanel[]noGlued multi-layer panels (P5-05). MODE-DISCRIMINATED; panel2d only today. Shape may gain optional fields there; this is the v1 minimum.
planPlanyesMODE-DISCRIMINATED; the plan carries its own `mode` tag (= workflow.mode), covered by planHash.
quoteQuoteyes—
shippingOrderShippingno—
filesFileRef[]no—
signatureSignatureno—

Workflow

The tenant workflow this order was made in (tenant-config.v1 workflows[].id, or `default` for the implicit workflow). `mode` and `profile` are repeated so a consumer can dispatch without fetching the config; the quote token binds `id` and `mode`.

FieldTypeRequiredDescription
idstringyes—
mode"panel2d"yesA BUILT mode (x-cfg-modes.built). Reserved ⇒ `mode_unavailable`; unknown ⇒ `enum`.
profile"furniture"yes—

Source

Provenance: which embed build collected the list, which engine version produced the plan, which config snapshot priced it.

FieldTypeRequiredDescription
embedVersionstringyes—
engineVersionstringyes= plan.engineVersion (the Engine API's engineVersion).
configVersionintegeryes= $.configVersion.

CutPart

panel2d cut-list row = Engine API ApiPart2D (name, w, h, qty, rotatable, grain, grainGroup, priority, edgeBanding, material, meta) + the order's own id, group and machining. name/qty/material are REQUIRED here (optional on the API).

FieldTypeRequiredDescription
idstringyes—
namestringyesNo C0/C1 control characters (audit P7-01 F1: a newline in a name wrote DXF entities).
wnumberyesThe size the engine was given (after the tenant's dimension convention / edging deduction were applied).
hnumberyes—
qtyintegeryes—
materialstringyesCatalogue MaterialItem.id (the API's material partition key).
rotatablebooleanno—
grain"w" | "h"no—
grainGroupstringno—
prioritybooleanno—
edgeBandingEdgeBandingno—
metaobjectnoOpaque passthrough (= ApiPart2D.meta), ≤ 2048 bytes canonical.
groupstringnoRoom / cabinet / project the customer assigned; printed on labels and exports.
machiningMachiningOp[]no—

EdgeBanding

Per-edge banding TYPE references (catalogue EdgingItem.id); an absent side is not banded (= ApiPart2D.edgeBanding).

FieldTypeRequiredDescription
topstringno—
rightstringno—
bottomstringno—
leftstringno—

MachiningOp

A machining operation on the part (catalogue MachiningType.id). `params` stays open in v1; P5-04 types its known keys additively (see params).

FieldTypeRequiredDescription
typeIdstringyes—
qtyintegeryes—
paramsobjectnoOpen object; the KNOWN keys are typed (P5-04, additive): corner, measure, xMm, yMm, diameterMm, radiusMm, lengthMm, widthMm, depthMm. Per catalogue kind: hole/hinge = corner+measure+xMm+yMm+diameterMm[+depthMm]; groove = corner(top-left|top-right)+xMm+lengthMm[+widthMm+depthMm]; radius = corner+radiusMm. Any other key stays valid.

FullSheetItem

FieldTypeRequiredDescription
materialIdstringyes—
wnumberyes—
hnumberyes—
qtyintegeryes—

HardwareLine

FieldTypeRequiredDescription
hardwareIdstringyes—
qtyintegeryes—

BondedPanel

FieldTypeRequiredDescription
idstringyes—
wnumberyes—
hnumberyes—
qtyintegeryes—
layersBondedLayer[]yes—
namestringno—

BondedLayer

FieldTypeRequiredDescription
materialIdstringyes—
thicknessMmnumberyes—

Plan

The panel2d production plan as the Engine API returned it (ApiOptimize2DResponse fields), plus the `mode` tag and planHash. Numbers are the engine's own, in millimetres; sheets[].price / metrics.totalPrice are the engine's unit-less price fields, NOT money (prices live in `quote`).

FieldTypeRequiredDescription
mode"panel2d"yesThe mode tag — INSIDE the plan so planHash covers it; must equal $.workflow.mode (D15).
engine"heuristic" | "balanced" | "max"yes—
engineVersionstringyes—
deterministicbooleanyes—
sheetsSheet[]yes—
metricsMetrics2Dyes—
cutPlanarray | nullyesnull when the layout is not guillotine.
unplacedUnplaced2D[]yes—
warningsstring[]yes—
guillotineValidbooleanyes—
planHashstringyessha256 hex of canonicalize(plan without planHash) — RFC 8785; covers `mode`.

Sheet

= ApiSheet (types.ts).

FieldTypeRequiredDescription
wnumberyes—
hnumberyes—
pricenumber | nullyesThe engine's unit-less per-sheet price; the issuer passes null.
partsPlacedPart2D[]yes—
offcutsRect[]no—
materialstringno—
grain"w" | "h"no—
metaobjectno—

PlacedPart2D

= ApiPlacedPart2D (types.ts).

FieldTypeRequiredDescription
namestringyes—
xnumberyes—
ynumberyes—
wnumberyes—
hnumberyes—
rotatedbooleanyes—
metaobjectno—

Rect

= ApiRect (types.ts).

FieldTypeRequiredDescription
xnumberyes—
ynumberyes—
wnumberyes—
hnumberyes—

Metrics2D

= ApiMetrics2D (types.ts), unchanged: cutLines (collinear cuts merged), sawPasses (every strip crossed), cutLength (mm, convention-independent).

FieldTypeRequiredDescription
sheetCountintegeryes—
yieldPctnumberyes—
placedintegeryes—
totalintegeryes—
cutLinesintegeryes—
sawPassesintegeryes—
cutLengthnumberyes—
totalPricenumberyes—

CutStep

= ApiCutStep (types.ts): sheet is the 0-based index into plan.sheets, step restarts at 1 per sheet, stage is the 1-based machine pass.

FieldTypeRequiredDescription
sheetintegeryes—
stepintegeryes—
axis"h" | "v"yes—
posnumberyes—
lengthnumberyes—
stageintegeryes—

Unplaced2D

= ApiUnplaced2D (types.ts).

FieldTypeRequiredDescription
namestringyes—
wnumberyes—
hnumberyes—
qtyintegeryes—

Quote

FieldTypeRequiredDescription
pricedbooleanyesfalse under pricingMode = external: lines carry quantities, every amount is 0.
linesQuoteLine[]yes—
totalsTotalsyes—
quoteTokenstringyesSee x-cfg-quote-token. The merchant's server verifies it with the tenant's key (P4-02 /quote/verify).

QuoteLine

FieldTypeRequiredDescription
idstringyes—
type"cutPart" | "fullSheet" | "hardware" | "machining" | "bondedPanel" | "edging" | "surcharge" | "shipping" | "tax"yes—
labelstringyes—
qtynumberyesPieces, sheets, metres (edging) — the line's own unit.
unitAmountMoneyyes—
amountMoneyyesLine total after the tenant's rounding. Σ non-tax amounts = totals.net.
refLineRefno—
metaobjectno—

LineRef

What the line prices. At least one id when present.

FieldTypeRequiredDescription
partIdstringno—
materialIdstringno—
edgingIdstringno—
hardwareIdstringno—
machiningIdstringno—
zoneIdstringno—
ruleIdstringno—
bondedPanelIdstringno—

Totals

FieldTypeRequiredDescription
netMoneyyes—
taxMoneyyes—
grossMoneyyes—

Money

FieldTypeRequiredDescription
amountMinorintegeryes—
currencystringyes—

OrderShipping

Ids only — the delivery address is the merchant shop's data, not the contract's.

FieldTypeRequiredDescription
method"delivery" | "pickup"yes—
zoneIdstringno—
pickupLocationIdstringno—

FileRef

FieldTypeRequiredDescription
kind"pdf" | "labels" | "csv" | "dxf" | "svg" | "xlsx" | "json"yes—
urlstringyes—
sha256stringno—
bytesintegerno—

Signature

HMAC-SHA256 over canonicalize(order without signature). keyId names the tenant key (P2-07: derived from a master, the DB holds only the id).

FieldTypeRequiredDescription
alg"HMAC-SHA256"yes—
keyIdstringyes—
valuestringyes—

There is no "try it" button here on purpose: the secret key belongs on your server, never in a browser. The demo shop shows the embed and the order hand-off working end to end.

LegalConfigurator terms ·Data processing agreement ·Shopper privacy notice ·Third-party licences