get started

API reference

Saw settings explorer

Every setting on the v3 request's saw object — what it accepts, what it defaults to, which saws it applies to, and what the platform does when two settings disagree.

A SmartCut optimisation request describes the machine in one object: saw. It carries the stock type being cut, the cutting method, the blade width, the stacking and packing options, and, optionally, the saw's identity (vendor + model) so the platform can apply that saw's own constraints.

A request can carry one saw (saw as an object, applied to the whole job), several (saw as an array of objects that each carry an id, referenced by materials[].sawId), or a saw per material (materials[].saw). The rules below apply to each saw independently.

Settings that contradict each other are resolved, not rejected. A cut type the stock cannot take is clamped, a spacing value on a saw that has no spacing is zeroed, and the response's warnings name the rule that fired. Only a value outside the schema is a 400. 12 rules do that resolving; all of them are listed below, and you can run your own saw through them.

Interactive

Try a saw

Build a saw with the controls, or paste one — a bare saw object, an array of identified saws, or a whole v3 request. Everything runs in your browser against the same schema and the same rule registry the API uses; nothing is sent anywhere.

General

stockType

Type of stock material

Cutting

cutType

Type of cutting algorithm. `guillotine` and `beam` produce edge-to-edge saw cuts; `efficiency` packs without the guillotine constraint; `nesting` is IRREGULAR nesting for CNC routers and similar — give each part an `outline` (and optional `holes`) and it is packed as its true shape rather than its bounding rectangle.

cutPreference

Preferred cutting direction. Only applicable when cutType is 'guillotine' or 'beam'. Set to 'flex' to try both 'l' and 'w' on a per-sheet basis and keep the better orientation per sheet — charged at 2× the standard credit rate.

Blade

bladeWidth

Width of the saw blade

Stacking

stackHeight

Not applicable to this saw — it is accepted, but has no effect.

options.stackingMode

Part stacking mode

Guillotine options

guillotineOptions.strategy

Cutting strategy

guillotineOptions.maxPhase

Maximum cutting phase — the number of turns a board may take. guillotineOptions.maxPhase 1 (2-stage cutting) is not supported for beam saws — normalised to 2 (three-stage); 0 = unlimited

guillotineOptions.headCuts

Enable head cuts

guillotineOptions.limitStripDimensions

Prefer narrower strips, derived from the job's own parts (mean part depth, floored at a fifth of the board). Carries no dimension of its own — use maxStripWidth to state an operator limit. The two combine: with both set, the derived cap is tightened by maxStripWidth.

guillotineOptions.verticalPanelSaw

Arrange the layout for a vertical panel saw: narrowest strips at the top, residual waste at the bottom, cut from the top down. Works on any saw; no profile required.

guillotineOptions.maxStripWidth

Widest assembled strip an operator can safely handle, in the same units as every other dimension you send. The optimiser steers away from strips wider than this — it opens strips on parts within the limit wherever it can. Independent of limitStripDimensions and verticalPanelSaw: set this alone and it applies. It is a STRONG PREFERENCE, not a guarantee — a part whose own smaller side exceeds the limit cannot be made to fit one, and layouts are never left unplaced to satisfy it. Hard rejection of an over-wide strip requires a saw profile (sawProfileId), whose oracle reports strip-width-exceeded. Null = no limit.

Efficiency options

efficiencyOptions.primaryCompression

Not applicable to this saw — it is accepted, but has no effect.

Spacing

options.minSpacing

Not applicable to this saw — it is accepted, but has no effect.

options.minSpacingDimension.dimension

Not applicable to this saw — it is accepted, but has no effect.

options.minSpacingDimension.minSpacing

Not applicable to this saw — it is accepted, but has no effect.

Optimization

options.stockSelection

Stock selection method

EXPERIMENTAL — default optimisation model for jobs on this saw. Same values as the request-level `model`, which overrides it per job. Absent → `rectangle-guillotine-fast`. Naming a Max model here opts this saw in, subject to that model's own requirements (see `model`); otherwise the job runs Fast.

Identity

Saw vendor (e.g. Biesse, Mayer, SCM). Part of the identity triple (`vendor` + `model`) used to look up this saw's profile, which supplies its algorithm constraints and preferences. Optional — without an identity (or a `sawProfileId`) no profile is applied.

Saw model name (e.g. OptiPlanner, Pratika). Paired with `vendor` to resolve the saw profile.

Saw control software version (e.g. "CADmatic 5") — selects the CADmatic output dialect where recognised (5 → CAD5/PTNR, 3|4 → CAD4/PTN3), otherwise provenance only.

Accepted

The schema accepts this saw. 2 rules changed or explained something — below.

What the platform changed

  • cut-type.defaultdefaultinfo

    No cutType given — sheet stock defaults to 'guillotine'.

    • cutType"guillotine"
  • cut-preference.defaultdefaultinfo

    No cutPreference given — guillotine on sheet stock defaults to 'l'.

    • cutPreference"l"

The saw to send

{}

What the API would run

Every default filled in and every rule applied — the saw the optimiser sees, and the one the response echoes back.

{
  "stockType": "sheet",
  "bladeWidth": 0,
  "stackHeight": 100,
  "guillotineOptions": {
    "strategy": "efficiency",
    "maxPhase": 0,
    "headCuts": false,
    "limitStripDimensions": false,
    "verticalPanelSaw": false,
    "maxStripWidth": null
  },
  "efficiencyOptions": {
    "primaryCompression": "w"
  },
  "options": {
    "stockSelection": "efficiency",
    "minSpacing": 0,
    "stackingMode": "identical"
  },
  "cutType": "guillotine",
  "cutPreference": "l"
}
How the saw object fits together: the stock type decides the cut types, the pair decides the cut directions, and both decide which option groups have any effect. Dashed amber edges are the rules that fired for the saw above.
sheet stock accepts guillotine cuttingsheet stock accepts efficiency cuttingsheet stock accepts beam cuttingsheet stock accepts nesting cuttingroll stock accepts guillotine cuttingroll stock accepts efficiency cuttingroll stock accepts nesting cuttingguillotine on sheet stock accepts cut direction 'l'guillotine on sheet stock accepts cut direction 'w'guillotine on sheet stock accepts cut direction 'flex'beam on sheet stock accepts cut direction 'l'beam on sheet stock accepts cut direction 'w'beam on sheet stock accepts cut direction 'flex'stack height applies to beam cuttingstacking mode applies to sheet stockstacking mode applies to linear stockguillotine strategy applies to guillotine cuttingguillotine strategy applies to sheet stockmaximum phase applies to beam cuttingprimary compression applies to efficiency cuttingprimary compression applies to sheet stockminimum spacing applies to efficiency cuttingcut-type.default: No cutType given — sheet stock defaults to 'guillotine'.cut-preference.default: No cutPreference given — guillotine on sheet stock defaults to 'l'.cut-preference.default: No cutPreference given — guillotine on sheet stock defaults to 'l'.stockType: sheet — accepts guillotine, efficiency, beam, nestingsheetin usestockType: roll — accepts guillotine, efficiency, nestingrollstockType: linear — accepts no cut typelinearcutType: efficiencyefficiencycutType: guillotineguillotineset by a rulecutType: beambeamcutType: nestingnestingcutPreference: llset by a rulecutPreference: wwcutPreference: flexflexBlade: bladeWidthBladealwaysblade widthStacking: stackHeight, options.stackingModeStackingstack heightstacking modeGuillotine options: guillotineOptions.strategy, guillotineOptions.maxPhase, guillotineOptions.headCuts, guillotineOptions.limitStripDimensions, guillotineOptions.verticalPanelSaw, guillotineOptions.maxStripWidthGuillotine optionsguillotine strategymaximum phasehead cutslimit strip dimensionsvertical panel sawmax strip widthEfficiency options: efficiencyOptions.primaryCompressionEfficiency optionsn/aprimary compressionSpacing: options.minSpacing, options.minSpacingDimension.dimension, options.minSpacingDimension.minSpacingSpacingn/aminimum spacingminimum dimensiondimension specific minimum spacingOptimization: options.stockSelection, algorithmOptimizationalwaysstock selectionalgorithmStock typeCut typeCut directionSettings unlocked

Node states

  • In use — the value this saw resolves to
  • Available — the API would accept it here
  • Not applicable — accepted, but with no effect
  • Set by a rule — the platform wrote this value
  • Rejected — the schema would 400 on it

Rules on the map

  • linear.no-cut-type-or-preferencecoerce
  • cut-type.defaultdefault
  • cut-type.valid-for-stockclamp
  • cut-preference.valid-for-stock-cut-typeclamp
  • cut-preference.defaultdefault
  • stacking-mode.none-for-rollcoerce
  • min-spacing.efficiency-onlycoerce
  • strategy.time-ignored-for-beamcoerce
  • maxPhase.two-stage-normalised-for-beamcoerce
  • algorithm.ineligibleignore
  • profile.max-nested-cut-depth-sets-max-phasederive
  • profile.cut-preference-clampedderive

Reference

Settings

Every public field of the saw object, read from the schema the API validates against. Omit a field and the default applies. Send a field that does not apply to your saw and it is accepted but has no effect — the explorer above lists those explicitly.

Setting Type Accepts Default Applies to Description
General
stockType stock type enum sheet, linear, roll "sheet" Always Type of stock material
Cutting
cutType cut type enum efficiency, guillotine, beam, nesting Always Type of cutting algorithm. `guillotine` and `beam` produce edge-to-edge saw cuts; `efficiency` packs without the guillotine constraint; `nesting` is IRREGULAR nesting for CNC routers and similar — give each part an `outline` (and optional `holes`) and it is packed as its true shape rather than its bounding rectangle.
cutPreference cut preference enum l, w, flex sheet or linear stock · guillotine or beam cutting Preferred cutting direction. Only applicable when cutType is 'guillotine' or 'beam'. Set to 'flex' to try both 'l' and 'w' on a per-sheet basis and keep the better orientation per sheet — charged at 2× the standard credit rate.
Blade
bladeWidth blade width number number, ≥ 0 0 Always Width of the saw blade
Stacking
stackHeight stack height number integer, ≥ 0 100 beam cutting Maximum stack height for beam saw
options.stackingMode stacking mode enum dimensions, identical "identical" sheet or linear stock Part stacking mode
Guillotine options
guillotineOptions.strategy guillotine strategy enum efficiency, time "efficiency" sheet stock · guillotine cutting Cutting strategy
guillotineOptions.maxPhase maximum phase number integer, ≥ 0, ≤ 10 0 guillotine or beam cutting Maximum cutting phase — the number of turns a board may take. guillotineOptions.maxPhase 1 (2-stage cutting) is not supported for beam saws — normalised to 2 (three-stage); 0 = unlimited
guillotineOptions.headCuts head cuts boolean true, false false guillotine or beam cutting Enable head cuts
guillotineOptions.limitStripDimensions limit strip dimensions boolean true, false false guillotine or beam cutting Prefer narrower strips, derived from the job's own parts (mean part depth, floored at a fifth of the board). Carries no dimension of its own — use maxStripWidth to state an operator limit. The two combine: with both set, the derived cap is tightened by maxStripWidth.
guillotineOptions.verticalPanelSaw vertical panel saw boolean true, false false sheet stock · guillotine cutting Arrange the layout for a vertical panel saw: narrowest strips at the top, residual waste at the bottom, cut from the top down. Works on any saw; no profile required.
guillotineOptions.maxStripWidth max strip width number number, ≥ 0 null sheet stock · guillotine cutting Widest assembled strip an operator can safely handle, in the same units as every other dimension you send. The optimiser steers away from strips wider than this — it opens strips on parts within the limit wherever it can. Independent of limitStripDimensions and verticalPanelSaw: set this alone and it applies. It is a STRONG PREFERENCE, not a guarantee — a part whose own smaller side exceeds the limit cannot be made to fit one, and layouts are never left unplaced to satisfy it. Hard rejection of an over-wide strip requires a saw profile (sawProfileId), whose oracle reports strip-width-exceeded. Null = no limit.
Efficiency options
efficiencyOptions.primaryCompression primary compression enum l, w "w" sheet stock · efficiency cutting Primary compression direction (l=length/horizontal, w=width/vertical)
Spacing
options.minSpacing minimum spacing number number, ≥ 0 0 efficiency cutting Minimum spacing between parts
options.minSpacingDimension.dimension minimum dimension number number, ≥ 0 efficiency cutting Parts with length or width equal to or smaller than this value will use the spacing below
options.minSpacingDimension.minSpacing dimension specific minimum spacing number number, ≥ 0 efficiency cutting Minimum spacing for parts meeting the dimension threshold
Optimization
options.stockSelection stock selection enum efficiency, smallest "efficiency" Always Stock selection method
algorithm string rectangle-guillotine-fast, rectangle-guillotine-max-1, rectangle-guillotine-max-2, rectangle-guillotine-max-3, irregular-nesting-fast, irregular-nesting-max-1, irregular-nesting-max-2 Always EXPERIMENTAL — default optimisation model for jobs on this saw. Same values as the request-level `model`, which overrides it per job. Absent → `rectangle-guillotine-fast`. Naming a Max model here opts this saw in, subject to that model's own requirements (see `model`); otherwise the job runs Fast.
Identity
vendor string string Always Saw vendor (e.g. Biesse, Mayer, SCM). Part of the identity triple (`vendor` + `model`) used to look up this saw's profile, which supplies its algorithm constraints and preferences. Optional — without an identity (or a `sawProfileId`) no profile is applied.
model string string Always Saw model name (e.g. OptiPlanner, Pratika). Paired with `vendor` to resolve the saw profile.
softwareVersion string string Always Saw control software version (e.g. "CADmatic 5") — selects the CADmatic output dialect where recognised (5 → CAD5/PTNR, 3|4 → CAD4/PTN3), otherwise provenance only.

Reference

Stock type × cut type

Which cutting method each stock type accepts, and the cut directions that pair allows. A cut type outside the row is clamped to the row's first entry; a cut direction outside the cell is cleared.

Stock type efficiencyguillotinebeamnesting
sheet accepted
no cut direction
accepted
l, w, flex
accepted
l, w, flex
accepted
no cut direction
roll accepted
no cut direction
accepted
w
not accepted accepted
no cut direction
linear not accepted not accepted not accepted not accepted

Linear stock is cut to length — there is no layout to arrange, so it takes no cut type and no cut direction at all. Roll stock rips one way, across the roll (w).

Reference

Resolution rules

Applied in this order, each one seeing the result of the ones before it. Every rule has a stable id that appears in the response warnings, so a warning can be looked up here.

  1. 1 linear.no-cut-type-or-preference coerce info

    Linear stock has no cut type or cut preference

    Linear stock (bars, profiles, lengths) is cut to length; the optimiser arranges nothing on it, so a cut type or cut preference sent with linear stock is dropped rather than applied.

    reads stockType writes cutTypecutPreference

  2. 2 cut-type.default default info

    cutType defaults to the first cut type the stock type accepts

    cutType is optional. When omitted, the stock type's first accepted cut type is used (sheet and roll: guillotine; linear stock takes none).

    reads stockTypecutType writes cutType

  3. 3 cut-type.valid-for-stock clamp warning

    cutType must be one the stock type accepts

    Each stock type accepts a fixed set of cut types (sheet: guillotine, efficiency, beam, nesting; roll: guillotine, efficiency, nesting; linear: none). A cutType outside that set resolves to the first accepted one.

    reads stockTypecutType writes cutType

  4. 4 cut-preference.valid-for-stock-cut-type clamp warning

    cutPreference must be one the (stock type, cut type) pair accepts

    Only the guillotine family (guillotine, beam) has a cut direction: sheet stock accepts l, w or flex; roll stock rips one way (w). Efficiency, nesting and linear have no direction, so a value sent for them is cleared.

    reads stockTypecutTypecutPreference writes cutPreference

  5. 5 cut-preference.default default info

    cutPreference defaults to length-first

    A guillotine-family saw with no cut preference cuts length-first (l), or the only direction the stock allows (roll: w).

    reads stockTypecutTypecutPreference writes cutPreference

  6. 6 stacking-mode.none-for-roll coerce warning

    Roll stock cannot stack

    Roll stock is a single continuous length; there are no sheets to stack, so any stacking mode is forced to none.

    reads stockTypeoptions.stackingMode writes options.stackingMode

  7. 7 min-spacing.efficiency-only coerce warning

    Part spacing only applies to efficiency packing

    Part-to-part spacing is an efficiency-packing concept. The guillotine family and nesting derive their gaps from the blade width (kerf), so a spacing value sent for them is zeroed rather than carried as a setting the layout never honours.

    reads cutTypeoptions.minSpacingoptions.minSpacingDimension.dimensionoptions.minSpacingDimension.minSpacing writes options.minSpacingoptions.minSpacingDimension.dimensionoptions.minSpacingDimension.minSpacing

  8. 8 strategy.time-ignored-for-beam coerce warning

    Beam saws ignore guillotineOptions.strategy 'time'

    'time' trades material efficiency for layouts whose strips share cut positions, so a manual operator moves the fence fewer times. A beam saw positions its fence automatically for every cut, so the trade buys it nothing (and it used to suppress stacking, the beam saw's headline economy). Normalised rather than rejected because live callers send beam + time today.

    reads cutTypeguillotineOptions.strategy writes guillotineOptions.strategy

  9. 9 maxPhase.two-stage-normalised-for-beam coerce warning

    Beam saws cannot cut 2-stage (guillotineOptions.maxPhase 1)

    maxPhase counts the TURNS a board may take: 1 is 2-stage cutting (rip, turn, crosscut, no recut), 2 is three-stage. 2-stage is rare on the beam saws our customers run, and the cut derivation cannot yet build a dense layout inside that cap — it refuses the cuts that would free the parts, and the job spills onto boards that a three-stage cap fits comfortably. So a beam saw asking for 1 is normalised to 2 rather than run into that: nothing is rejected, the caller is told which rule fired, and 0 (unlimited) and every value from 2 up are left exactly as sent. Guillotine (table-saw) cutting still expresses 1 — the normalisation is beam-only.

    reads cutTypeguillotineOptions.maxPhase writes guillotineOptions.maxPhase

  10. 10 algorithm.ineligible ignore info

    The chosen optimisation model does not fit this saw

    The Max tiers are gated per family (rectangle-guillotine-max-* need a beam saw with a recognised profile and a part cap; irregular-nesting-max-* need a nesting saw). A model that does not fit the job safely falls back to the default — it never errors.

    reads algorithmcutType writes nothing (the value is accepted, it just has no effect)

  11. 11 profile.max-nested-cut-depth-sets-max-phase derive info

    A saw profile with a nesting-depth limit sets maxPhase

    When a recognised saw (vendor + model) declares a maximum nested cut depth and the request leaves maxPhase at 0 (no limit), the profile's depth is applied so the optimiser never plans a pattern the saw's controller rejects.

    reads guillotineOptions.maxPhase writes guillotineOptions.maxPhase

  12. 12 profile.cut-preference-clamped derive warning

    A saw profile's supported cut directions clamp cutPreference

    A saw that physically cannot rip short-side-first must not be handed a 'w' job. When a recognised profile declares supportedCutPreferences, a direction outside the set is steered to 'flex' if allowed (the optimiser then chooses per board within the set), else the first allowed direction.

    reads cutPreference writes cutPreference

Kinds: default fills an unset value · clamp replaces a value the matrix does not allow · coerce rewrites a value another setting makes meaningless · ignore changes nothing and explains why the value will not take effect · derive means a recognised saw profile supplied or narrowed the value.

Reference

Recognised saws

Send vendor and model and the platform resolves the saw's own profile — the constraints the optimiser plans within, so it never produces a pattern the saw's controller rejects. Any model name in the aliases column resolves.

Vendor Saw Export formats Production model values that resolve Constraints the engine enforces
Biesse Biesse (Optiplanner XML) biesse-xml Validated optiplannerWN6XX_3200Selco WN6XX, 3200mm bedWN6XX_3800X3200Selco WN6XX, 3800×3200mm bedWN6XX_3800X3800Selco WN6XX, 3800×3800mm bedWN6XX_4500Selco WN6XX, 4500mm bedWN6XX_5900Selco WN6XX, 5900mm bedWN6XX7XX_3800Selco WN6XX/WN7XX, 3800mm bedWN6XX7XX_4500Selco WN6XX/WN7XX, 4500mm bedWN6XX7XX_5900Selco WN6XX/WN7XX, 5900mm bedWN6XXTP_3200Selco WN6XX TP, 3200mm bedWN6XXTP_3800X3200Selco WN6XX TP, 3800×3200mm bedWN6XXTP_3800X3800Selco WN6XX TP, 3800×3800mm bedWN6XXTP_4500Selco WN6XX TP, 4500mm bedWN7XX_3800Selco WN7XX, 3800mm bedWN7XX_4500Selco WN7XX, 4500mm bedWN7XX_5900Selco WN7XX, 5900mm bed
  • max nested cut depth: 3
  • nested column subdivision: true
  • head cuts: true
Biesse Biesse Selco (Beam) biesse-xml Provisional
  • nested column subdivision: false
  • head cuts: false
  • max pieces per strip: 50
Giben Giben (.ac) giben-link Provisional link none declared
Homag Homag (PTX) ptx Validated ptx
  • bed size: {"l":4300,"w":2250}
Homag Homag CADmatic homag-cadmatic Provisional cadmatic
  • nested column subdivision: false
  • max strip gap: 0
  • max part gap: 0
Homag MagiCut (CPOUT) homag-cpout Provisional magicut none declared
Jingwei Jingwei (CNC XML) jingwei-xml Provisional none declared
Mayer Mayer (.may) mayer-may Validated may
  • nested column subdivision: false
  • head cuts: false
  • max strip gap: 0
  • max part gap: 0
  • bed size: {"l":4500,"w":2200}
  • min offcut: {"l":150,"w":100}
Schelling Schelling Commander 2 schelling-commander-2 Provisional commander-2 none declared
Schelling Schelling Commander 4 schelling-commander-4 Provisional commander-4 none declared
SCM SCM (Pratika) biesse-xml Provisional pratika
  • nested column subdivision: false
SCM SCM Link (.900) scm-link Provisional link none declared
Striebig Striebig (vertical panel saw / IST PIOS) striebig-csv Provisional none declared

marks a constraint tightened by the export format rather than by the saw: the machine could do more, but the file we write for it cannot yet describe it. "Validated" means output for that saw has been checked against the saw's own control software.

The full request reference — every endpoint, every field, runnable samples — is in the v3 API reference, and the narrative walkthrough is in the API guide.