Skip to content
NestSolver Docs
Browse the docs

Calls

Linear cutting

Cut parts to length from bars, pipe, tube, extrusion or lumber with the least waste. Solves in one call.

Two calls, both taking the same body: a linear cut list, field for field as the web optimizer saves it.

Call Does Counts as
POST /v1/linear/validate Checks the cut list by the optimizer's rules, without solving Free call
POST /v1/linear/solves Solves it and answers with the plan Solve

The request

Numbers are strings, typed as on the web form, in unit.

{
  "unit": "in",
  "kerf": "0.125",
  "target": "waste",
  "strict": false,
  "miter_enabled": true,
  "material_width": "3.5",
  "stocks": [
    { "length": "240", "qty": "", "minimum_drop": "12", "price": "38.50", "zones": [] },
    { "length": "144", "qty": "2", "minimum_drop": "12", "zones": [{ "start": "0", "end": "6", "keep": false }] }
  ],
  "parts": [
    { "length": "47.5", "quantity": "8", "label": "Stringer" },
    { "length": "31.25", "quantity": "12", "label": "Tread", "miter_left": "45", "miter_right": "90" }
  ]
}
Field Meaning
unit mm, cm, m or in. Write inches as decimals: 47.5, not 47 1/2.
kerf The saw's kerf, lost at every cut.
target What the plan aims for: bars (fewest bars), waste, drop (the most reusable drop) or cost.
strict true fails the request when a part cannot be placed; false lists it under unplaced.
stocks[] Each stock length: length, qty (blank for as many as needed), minimum_drop (the shortest leftover worth keeping), optional price, material_key, and zones[] with start, end and keep for defects, bad sections and edge trims.
parts[] Each part: length, quantity, label, and optionally miter_left and miter_right in degrees (90 is square), priority, material_key, finish_left, finish_right, finish_label.
stock_mode stock (the default) or roll, a roll cut to length.
miter_enabled Whether the parts' miter angles count; material_width gives the stock's width for them, and is required when miters are on. Without miter_enabled: true, every miter reads as 90.

Options that belong to the Bench plan: stock_mode: "roll", target: "cost", material_key, priority, and the finish_* fields. On Free they are refused with 403 naming the plan. Miter cuts are on every plan, so the sample above solves on Free. A cut list past its tier's cap on cuts or stock lengths is refused with 422, upgrade naming the plan that takes it. Plans and limits has the caps.

The plan

{
  "unit": "in",
  "bars": [
    {
      "stock_row": 0,
      "length": 240,
      "material": "",
      "cuts": [{ "at": 0, "length": 47.5, "label": "Stringer", "rush": false }],
      "blocked": [],
      "leftovers": [{ "start": 190.5, "end": 240, "kind": "drop" }],
      "drop": 49.5,
      "scrap": 0
    }
  ],
  "metrics": { "bars": 3, "stock_length": 720, "parts_length": 755, "drop": 49.5, "blocked": 6, "scrap": 3.4, "utilization_percent": 91.2 },
  "unplaced": [{ "length": 31.25, "label": "Tread", "quantity": 1 }],
  "unpriced_stock_rows": [1],
  "cost": { "…": "when prices are given" },
  "explanation": "…"
}
  • bars[]: each bar used, from which stock_row, with cuts[] in order along the bar (at is where the cut starts), blocked[] spans, leftovers[] as drop (worth keeping) or scrap, and the bar's totals.
  • metrics: the job's totals in the request's unit, and the utilization.
  • unplaced[]: parts that did not fit, with how many. Empty when strict is true and the request succeeded.
  • unpriced_stock_rows[]: the stock rows used in the plan that have no price. Always present; empty when every used row is priced.
  • cost: the cost summary when prices are given, else null.

The exact shapes are in the API reference under LinearRequest and LinearReport.

Saw stop CSV

On the Bench plan and up, a solved plan on the web downloads a CSV for saw stops and push-feed saws. It has one header row, then one row for each run of the same cut on a bar, in the order the bar is cut:

Column Holds
Bar The bar's number, 1 for the first bar cut.
Order The row's place in that bar's cutting order.
Quantity How many of this cut, one after another.
Length The part's length as typed, in the plan's unit: up to 4 decimals in inches, 2 in millimetres.
Left angle, Right angle Each end's angle in whole degrees; 90 is a square end.
Label, Material The part's label and material.
Stock length The length of the bar it comes from.

The file is plain ASCII with commas between columns, as the cut list rules in TigerStop's TigerSaw manual ask: a length column, two angle columns for mitering, and quantity and part name beside them. Map the columns once in TigerLink or your saw's own import. Cut one test bar from the file and measure it before you run the job.

Labels

A solved plan on the web prints labels for every part and every drop, on every plan. A part label carries its name, length, material, its bar and where on the bar it is cut, and a QR code. A drop label carries its length, material, its bar and a QR code. The QR code holds short plain text that says what the piece is, so it reads without NestSolver. Exports lists the label sizes.