CutOptim Engine API
A deterministic cutting-optimization engine, callable over HTTP: the same request always returns the same cut plan — so you can audit it, quote from it, settle a dispute with it, and re-run last year’s order to get last year’s plan. It is the same engine that powers CutOptim, across the three rectangular modes (2D panels, 1D linear, and timber with cross-section matching), plus true-shape nesting for irregular polygon parts — POST /v1/optimize/nest, for laser, plasma and waterjet work. Send parts and stock, get back the full layout, cut plan and yield — ready to drop into an ERP, a quoting tool, or a machine’s own software.
See the full benchmark → · Measured, not claimed
Why build on it
The same input always returns the same output — no randomness, no clock in the algorithm. You can cache results and diff them in tests.
Not just rectangles: the guillotine cut sequence, cut lines vs. saw passes, sawn length, and a flag telling you whether it is producible on a panel saw.
Kerf, per-side trim, tolerance, cost mode, grain groups, max cutting stages, rotation minimising — the same options the app exposes.
What the API does
One call each for 2D panels, 1D linear stock, timber with cross-section matching, and true-shape nesting of irregular polygons — POST /v1/optimize/2d, /1d, /wood and /nest.
POST /v1/optimize/nest packs arbitrary polygons (with holes) onto fixed sheets, interlocking parts into each other’s concave pockets — 6 sheets where the same parts by bounding box need 9. For laser, plasma and waterjet. Per-sheet exclusion zones (a defect, a clamp) come with it.
Tag parts and stock with a material and the optimizer partitions the job: each material is cut only from its own stock. On every mode; a per-material rollup comes back.
Name a banding type per edge (2D) and the response totals the running metres per type — per part and per order. Metadata: it never moves a part.
Ask for include:["svg","csv","dxf"] and the response carries the layout as a ready-made file, inline — a standalone 2D SVG drawing, an R12/AC1009 DXF, or a CSV cut list. No storage, no second call.
Attach a meta object — your ERP article number, order-line id, customer ref — to any part or stock row and it comes back verbatim on every placed piece and every sheet/rod, so the plan reconciles with your system.
POST /v1/validate/{2d,1d,wood,nest} schema-validates the same body without solving — no key, no quota. Check a payload will not be rejected and get feasibility warnings before you spend a call.
minimizeCost ranks by the lowest total bill across priced stock sizes, mixing formats; the default minimizes material. Both run the same guillotine algorithm.
Mark stock to use up first, treat quantities as a hard cap with respectStock, and flag must-cut parts that win board space when material is short.
Not just rectangles: the guillotine cut sequence with per-step stop positions, cut lines vs. saw passes, sawn length, and a producible-on-a-panel-saw flag.
kerf, per-side trim, tolerance, grain groups, maxCutStages and rotation minimising — the same options the app exposes.
The same input always returns the same output — cache and diff it. A pinnable engine version and an OpenAPI 3.1 document describe the whole contract.
Send an SVG or DXF instead of coordinates: parts[].source reads the outline and its holes out of the drawing, and POST /v1/import/nest splits a multi-part file first. Nothing is stored — the file is parsed in memory and is gone with the response.
Which engine serves which mode
The endpoint you POST to picks the mode; the engine parameter picks the algorithm. The default heuristic engine serves 2D, 1D and timber; balanced and the asynchronous max engine are 2D only; and true-shape nesting runs on its own lbf engine. Same engine as the app, over HTTP.
- heuristic — The default — a guillotine multi-strategy packer. Highest yield, every layout is saw-cuttable, and it always returns a cut plan. It serves 2D, 1D and timber.
- balanced — An opt-in MaxRects free-nester for 2D. Much faster on very large jobs for slightly less yield, but its layouts often cannot be sawn edge-to-edge, so they carry no cut plan.
- max — An asynchronous tree search for 2D. It reaches the proven optimum on far more jobs, at seconds-to-a-minute per solve — you submit the job and poll GET /v1/jobs/{id} for the result. Still deterministic and saw-cuttable.
- lbf — The true-shape nesting engine. It packs irregular polygons into each other’s pockets for laser, plasma and waterjet; a higher-density sparrow build is planned.
Which endpoint for which material: flat sheets — plywood, MDF, glass, acrylic, sheet metal — go to /v1/optimize/2d; bars, tube, pipe and profile to /v1/optimize/1d; structural timber (a 50×150 only from 50×150) to /v1/optimize/wood; irregular polygons for laser, plasma and waterjet to /v1/optimize/nest.
One call, a full plan
curl https://api.cutoptim.com/v1/optimize/2d \
-H "Authorization: Bearer co_live_…" \
-H "Content-Type: application/json" \
-d '{
"parts": [
{ "name": "Door", "w": 600, "h": 400, "qty": 4 },
{ "name": "Shelf", "w": 800, "h": 300, "qty": 6 }
],
"stock": [{ "w": 2440, "h": 1220, "price": 42 }],
"options": { "kerf": 3, "effort": "balanced" },
"engine": "heuristic"
}'Comes back as:
{
"metrics": { "sheetCount": 1, "yieldPct": 80.62, "placed": 10, "total": 10,
"cutLines": 10, "sawPasses": 13, "cutLength": 10720, "totalPrice": 42 },
"sheets": [ … ],
"cutPlan": [{ "sheet": 0, "step": 1, "axis": "h", "pos": 400, "length": 2440, "stage": 1 }, … ],
"guillotineValid": true,
"engineVersion": "1.0.0+10e0c941",
"deterministic": true
}Full request and response shape, every option, all error codes and all three engines:API reference →
Fast or dense? Pick with one option
The effort option trades solve time against yield. Here is that trade, measured on one demanding job — every figure comes from the real packer.
And it is fast either way: even the largest production jobs — 2,000 parts and more — solve in single-digit seconds on the default engine, comfortably inside the API time budget.
Pricing
Larger volumes. 10,000 requests a month is the standard plan, not a ceiling on what we can run. If you need more — higher volume, separate keys for staging and production, or a dedicated arrangement — tell us your numbers and we price it individually. Tell us your volume →
The regular CutOptim plans (Free / Pro / Workshop) are unrelated to the API — the in-app optimizer stays included in them. See app pricing →
Solutions by industry
The same engine, positioned for the way one trade cuts. Each page shows the endpoint, a request and a response, and the fields that matter for that material.
1D cut-to-length for tube, pipe and hollow section. POST /v1/optimize/1d
1D cut-to-length for steel and aluminium profile, bar and section, with cost mode. POST /v1/optimize/1d
2D guillotine, zero-kerf score-and-snap for float, tempered and mirror glass. POST /v1/optimize/2d
1D cut-to-length for structural timber with cross-section matching. POST /v1/optimize/wood
True-shape nesting of irregular polygons, with exclusion zones. POST /v1/optimize/nest
True-shape nesting onto plate for laser, plasma or waterjet. POST /v1/optimize/nest
Bar bending schedule optimization for reinforcement steel. · design partners wanted
The why, what and how of the CutOptim Engine API on two pages — the three modes, a request and response, determinism and pricing. Print-ready, with a QR back to this page.