API reference
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
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.
stockTypeType of stock material
cutTypeType 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.
cutPreferencePreferred 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.
bladeWidthWidth of the saw blade
stackHeightNot applicable to this saw — it is accepted, but has no effect.
options.stackingModePart stacking mode
guillotineOptions.strategyCutting strategy
guillotineOptions.maxPhaseMaximum 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.headCutsEnable head cuts
guillotineOptions.limitStripDimensionsPrefer 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.verticalPanelSawArrange 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.maxStripWidthWidest 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.
efficiencyOptions.primaryCompressionNot applicable to this saw — it is accepted, but has no effect.
options.minSpacingNot applicable to this saw — it is accepted, but has no effect.
options.minSpacingDimension.dimensionNot applicable to this saw — it is accepted, but has no effect.
options.minSpacingDimension.minSpacingNot applicable to this saw — it is accepted, but has no effect.
options.stockSelectionStock 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.
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.
The schema accepts this saw. 2 rules changed or explained something — below.
cut-type.defaultdefaultinfoNo cutType given — sheet stock defaults to 'guillotine'.
cutType→"guillotine"cut-preference.defaultdefaultinfoNo cutPreference given — guillotine on sheet stock defaults to 'l'.
cutPreference→"l"saw to send{}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"
}linear.no-cut-type-or-preferencecoercecut-type.defaultdefaultcut-type.valid-for-stockclampcut-preference.valid-for-stock-cut-typeclampcut-preference.defaultdefaultstacking-mode.none-for-rollcoercemin-spacing.efficiency-onlycoercestrategy.time-ignored-for-beamcoercemaxPhase.two-stage-normalised-for-beamcoercealgorithm.ineligibleignoreprofile.max-nested-cut-depth-sets-max-phasederiveprofile.cut-preference-clampedderiveReference
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
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 | efficiency | guillotine | beam | nesting |
|---|---|---|---|---|
| sheet | accepted no cut direction | acceptedl, w, flex | acceptedl, w, flex | accepted no cut direction |
| roll | accepted no cut direction | acceptedw | 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
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.
linear.no-cut-type-or-preference coerce info 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
cut-type.default default info 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
cut-type.valid-for-stock clamp warning 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
cut-preference.valid-for-stock-cut-type clamp warning 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
cut-preference.default default info 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
stacking-mode.none-for-roll coerce warning 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
min-spacing.efficiency-only coerce warning 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
strategy.time-ignored-for-beam coerce warning '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
maxPhase.two-stage-normalised-for-beam coerce warning 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
algorithm.ineligible ignore info 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)
profile.max-nested-cut-depth-sets-max-phase derive info 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
profile.cut-preference-clamped derive warning 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
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 |
|
| Biesse | Biesse Selco (Beam) | biesse-xml | Provisional | — |
|
| Giben | Giben (.ac) | giben-link | Provisional | link | none declared |
| Homag | Homag (PTX) | ptx | Validated | ptx |
|
| Homag | Homag CADmatic | homag-cadmatic | Provisional | cadmatic |
|
| 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 |
|
| 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 |
|
| 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.