CutOptim Engine API
Un API de optimizare a tăierii: trimiți piesele și materialul — plăci 2D, bare 1D, lemn sau nesting true-shape pentru piese neregulate — și primești înapoi layoutul, planul de tăiere și utilizarea materialului. Implicit, aceeași cerere returnează întotdeauna același plan.
Vezi benchmarkul complet → · Măsurat, nu pretins
{
"parts": [
{ "name": "bracket", "polygon": […], "qty": 12, … },
{ "name": "gusset", "polygon": […], "qty": 14, … },
{ "name": "plate", "polygon": […], "holes": […], "qty": 12, … },
{ "name": "flange", "source": { … }, "qty": 10, … }
],
"stock": [{ "w": 2500, "h": 1250, "exclusions": […], … }],
"options": { "minSeparation": 5, "edgeClearance": 10 }
}De ce să construiești pe el
Aceeași intrare returnează întotdeauna același rezultat — fără aleatoriu, fără ceas în algoritm. Poți pune rezultatele în cache și le poți compara în teste. Singura excepție opțională, căutarea max pentru nesting, limitată în timp, o spune ea însăși în fiecare răspuns (deterministic: false).
Nu doar dreptunghiuri: secvența de tăiere ghilotină, linii de tăiere față de treceri de ferăstrău, lungimea tăiată și un indicator care îți spune dacă poate fi produs pe un ferăstrău pentru panouri.
Kerf, tolerance, tăiere de margine pe fiecare latură, mod cost, direcția fibrei și potrivirea fibrei, număr maxim de etape de tăiere, minimizarea rotirii — aceleași opțiuni pe care le oferă și aplicația.
Îl construiești sau îl apelezi
Un optimizator de tăiere pare un proiect de weekend și se transformă într-un șir lung de cazuri speciale: aritmetica kerf-ului și a tăierii de margine, materialul care se termină, regulile de rotire și de fibră, aranjamente care trebuie să fie tăiabile de la o margine la alta, poligoane cu holes — și o suită de regresie care demonstrează că o modificare nu înrăutățește niciodată un plan. Engine API este exact această muncă, deja făcută și măsurată.
Scrierea și validarea a patru optimizatoare — panouri ghilotină 2D, material liniar 1D, lemn pe secțiune și nesting true-shape — și menținerea lor corecte pe măsură ce cerințele tale cresc. Echipa ta integrează un singur contract HTTP în loc de toate acestea.
Calitatea planurilor este publicată, nu doar afirmată: benchmarkul deschis rulează motorul pe seturi de instanțe academice publice și pe lucrări generate, cu metoda și rezultatele brute disponibile pentru descărcare. Rulează aceleași instanțe și pe orice altă soluție pe care o iei în considerare.
Un preț afișat pe pagină, o perioadă de probă de 14 zile și o cheie din dashboardul tău — fără apel de vânzări și fără negociere de licență înainte de a putea testa. Endpointurile validate nu cer deloc o cheie.
Modelul tău de date, interfața ta și regulile tale de preț. Apelurile sincrone nu stochează nimic; o lucrare max asincronă își păstrează rezultatul doar pentru o fereastră scurtă de reținere, cât să-l poți interoga. Un obiect meta atașat oricărei piese sau plăci revine identic, așa că planul se reconciliază cu evidențele tale.
Aveți nevoie de un ecran de comandă gata făcut în loc să-l construiți?
CutOptim Configurator rulează pe acest motor →Conectați magazinul sau ERP-ul propriu →Prețuri
Fiecare cerere contează la fel — nesting inclus · Vă trimitem un e-mail la 90% din cotă și când aceasta se epuizează.
Încercați gratuit: o cheie demo publică în documentația API și chei de test cu 1,000 cereri pe lună, care nu se facturează niciodată
Volume mai mari. Cele 10,000 cereri pe lună sunt planul standard, nu un plafon al a ceea ce putem rula. Dacă ai nevoie de mai mult — volum mai mare, chei separate pentru staging și producție sau o înțelegere dedicată — spune-ne cifrele tale și îl tarifăm individual. Spune-ne volumul tău →
Prin abonare accepți: Engine API Service Terms (în engleză).
Planurile obișnuite CutOptim (Gratuit / Pro / Atelier) nu au legătură cu API-ul — optimizatorul din aplicație rămâne inclus în ele. Vezi prețurile aplicației →
Ce intră, ce iese
O lucrare reală pentru fiecare mod: sus corpul cererii, dedesubt planul primit, desenat direct din răspuns.
POST /v1/optimize/2d{
"parts": [
{ "name": "Side", "w": 720, "h": 560, "qty": 6 },
{ "name": "Bottom", "w": 764, "h": 560, "qty": 3 },
{ "name": "Top", "w": 764, "h": 560, "qty": 3 },
{ "name": "Shelf", "w": 762, "h": 520, "qty": 3 },
{ "name": "Rail", "w": 764, "h": 100, "qty": 6 },
{ "name": "Plinth", "w": 764, "h": 120, "qty": 6 },
{ "name": "Door", "w": 397, "h": 716, "qty": 6, "rotatable": false },
{ "name": "Drawer front", "w": 796, "h": 176, "qty": 3 }
],
"stock": [
{ "w": 2800, "h": 2070, "qty": 5, "price": 38.5 }
],
"options": { "kerf": 4, "trim": { "left": 10, "right": 10, "top": 10, "bottom": 10 } }
}200 · sheets[].parts- Plăci
- 2
- sheetCount
- Randament
- 80,31 %
- yieldPct
- Piese plasate
- 36 / 36
- placed
- Linii de tăiere
- 39
- cutLines
- Cost material
- 77
- totalPrice
Un șir de corpuri de bază din PAL standard. Ușile își păstrează fibra (rotatable: false); toate celelalte piese se pot roti.
Vrei imaginea direct de la API? La 2D și nesting adaugă "svg" în include și răspunsul conține desenul.
POST /v1/optimize/1d{
"parts": [
{ "name": "Post", "length": 2400, "qty": 4 },
{ "name": "Rail", "length": 1750, "qty": 6 },
{ "name": "Brace", "length": 940, "qty": 8 },
{ "name": "Cross", "length": 620, "qty": 10 }
],
"stock": [
{ "length": 6000, "qty": 10, "price": 24.9 }
],
"options": { "kerf": 3, "trim": { "start": 10 } }
}200 · rods[].parts- Bare
- 6
- rodCount
- Randament
- 93,94 %
- yieldPct
- Piese plasate
- 28 / 28
- placed
- Tăieturi
- 28
- cuts
- Cost material
- 149,4
- totalPrice
O listă de debitare pentru un cadru din oțel din bare întregi. Fiecare bară arată unde încep piesele (pos) și cât rămâne (remaining).
POST /v1/optimize/wood{
"parts": [
{ "name": "Stud", "sw": 45, "sh": 95, "length": 2350, "qty": 6 },
{ "name": "Nogging", "sw": 45, "sh": 95, "length": 555, "qty": 12 },
{ "name": "Joist", "sw": 45, "sh": 145, "length": 3600, "qty": 3 },
{ "name": "Blocking", "sw": 45, "sh": 145, "length": 1150, "qty": 3 }
],
"stock": [
{ "name": "C24 45x95", "sw": 45, "sh": 95, "length": 4800, "qty": 10, "price": 9.8 },
{ "name": "C24 45x145", "sw": 45, "sh": 145, "length": 4800, "qty": 6, "price": 14.6 }
],
"options": { "kerf": 3 }
}200 · sections[].rods[].parts- Secțiuni
- 2
- sectionCount
- Bare
- 8
- rodCount
- Randament
- 91,17 %
- yieldPct
- Piese plasate
- 24 / 24
- placed
- Cost material
- 92,8
- totalPrice
Cherestea de construcție în două secțiuni. Fiecare secțiune se taie doar din propriul material și revine cu propriile totaluri.
POST /v1/optimize/nest{
"parts": [
{ "name": "bracket", "polygon": [[0,0], [300,0], [300,100], [100,100], [100,300], [0,300]], "qty": 12, "allowedRotations": [0,90,180,270] },
{ "name": "gusset", "polygon": [[0,0], [250,0], [0,250]], "qty": 14, "allowedRotations": [0,90,180,270] },
{ "name": "plate", "polygon": [[0,0], [240,0], [240,160], [0,160]], "holes": [[[60,65], [180,65], [180,95], [60,95]]], "qty": 12, "allowedRotations": [0,90] },
{ "name": "flange", "source": { "content": "<svg xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"90\" cy=\"90\" r=\"90\"/><circle cx=\"90\" cy=\"90\" r=\"32\"/><circle cx=\"90\" cy=\"30\" r=\"9\"/><circle cx=\"150\" cy=\"90\" r=\"9\"/><circle cx=\"90\" cy=\"150\" r=\"9\"/><circle cx=\"30\" cy=\"90\" r=\"9\"/></svg>", "filename": "flange.svg" }, "qty": 10, "allowedRotations": [0] }
],
"stock": [
{ "w": 2500, "h": 1250, "qty": 3, "price": 96, "exclusions": [{ "polygon": [[1150,0], [1350,0], [1350,70], [1150,70]], "quality": 0 }] }
],
"options": { "minSeparation": 5, "edgeClearance": 10 }
}Nesting-ul nu face parte din demo-ul public — rulați acest exemplu cu o cheie de test gratuită. Creează o cheie de test gratuită
200 · sheets[].parts- Plăci
- 1
- sheetCount
- Umplere
- 56,32 %
- density
- Piese plasate
- 48 / 48
- placed
- Lungime de tăiere
- 49.463
- cutLength
- Străpungeri
- 110
- pierces
Piese din oțel tăiate cu laserul: trei trimise ca coordonate, flanșa ca fișier SVG (source). Nicio piesă nu intră în zona de prindere (exclusions) și toate păstrează distanța cerută (minSeparation).
Vrei imaginea direct de la API? La 2D și nesting adaugă "svg" în include și răspunsul conține desenul.
Fiecare desen este făcut din coordonatele din răspuns — nimic nu este așezat de mână. Cele patru lucrări sunt rezolvate de același motor care rulează în spatele API-ului, iar testele noastre le rezolvă din nou ca cifrele să rămână adevărate.
Ce face API-ul
Câte un apel pentru panouri 2D, material liniar 1D, lemn cu potrivire de secțiune și nesting true-shape al poligoanelor neregulate — POST /v1/optimize/2d, /1d, /wood și /nest.
POST /v1/optimize/nest împachetează poligoane arbitrare (cu holes) pe plăci fixe, întrepătrunzând piesele în buzunarele concave ale celorlalte — 6 sheets acolo unde aceleași piese după bounding box au nevoie de 9. Pentru laser, plasmă și jet de apă. Zonele de excludere per placă (un defect, o clemă) vin la pachet.
Etichetează piesele și stocul cu un material, iar optimizatorul împarte lucrarea: fiecare material este tăiat doar din propriul stoc. Pe fiecare mod; se întoarce un rezumat pe material.
Denumește un tip de cant per muchie (2D), iar răspunsul totalizează metrii liniari pe tip — pe piesă și pe comandă. Metadate: nu mută niciodată o piesă.
Numește piesele al căror desen trebuie să continue — un front de sertar deasupra a două uși — într-un set (matchedSets, 2D), iar ele sunt tăiate una lângă alta dintr-o singură bucată de placă, la un kerf distanță. Fiecare membru revine cu setul și poziția lui, iar exporturile CSV, SVG și DXF le marchează și ele.
Cere include:["svg","csv","dxf"], iar răspunsul poartă layoutul ca fișier gata făcut, inline — un desen SVG 2D de sine stătător, un DXF R12/AC1009 sau o listă de tăiere CSV. Fără stocare, fără un al doilea apel.
Atașează un obiect meta — numărul de articol din ERP-ul tău, id-ul liniei de comandă, referința clientului — oricărei piese sau oricărui rând de material, iar el revine identic pe fiecare piesă plasată și pe fiecare placă/bară, astfel încât planul să se reconcilieze cu sistemul tău.
POST /v1/validate/{2d,1d,wood} validează schema aceluiași corp fără să-l rezolve — fără cheie, fără cotă. Verifică dacă un payload nu va fi respins și primește avertismente de fezabilitate înainte de a consuma un apel.
minimizeCost ordonează după factura totală cea mai mică între dimensiunile de stoc cu preț, amestecând formatele; implicit se minimizează materialul. Ambele rulează același algoritm guillotine.
Marchează stocul care se consumă primul, tratează cantitățile ca plafon strict cu respectStock și marchează piesele obligatoriu de tăiat, care câștigă spațiul pe placă atunci când materialul este insuficient.
Nu doar dreptunghiuri: secvența de tăiere guillotine cu pozițiile opritorului pe fiecare pas, linii de tăiere față de treceri de ferăstrău, lungimea tăiată și un indicator de fabricabilitate pe ferăstrău pentru panouri.
kerf, tăiere de margine pe fiecare latură, toleranță, direcția fibrei, seturi potrivite (matched sets), maxCutStages și minimizarea rotirii — aceleași opțiuni pe care le oferă aplicația.
Aceeași intrare returnează întotdeauna același rezultat — pune-l în cache și compară-l (căutarea opțională max pentru nesting, limitată în timp, raportează deterministic: false). O versiune de motor fixabilă și un document OpenAPI 3.1 descriu întregul contract.
Trimite un SVG sau un DXF în loc de coordonate: parts[].source citește conturul și găurile din desen, iar POST /v1/import/nest împarte întâi un fișier cu mai multe piese. Nimic nu se stochează — fișierul este prelucrat în memorie și dispare odată cu răspunsul.
Claude Code, Cursor, VS Code și Claude Desktop apelează motorul ca unelte prin https://api.cutoptim.com/mcp, cu aceeași cheie API și aceeași cotă ca REST. Rulează și local, ca pachetul npm @cutoptim/mcp.
Două viteze: ofertă acum, material economisit mai târziu
Majoritatea integrărilor au nevoie de amândouă — un răspuns cât timp așteaptă clientul, și un plan mai strâns când lucrarea ajunge la mașină. Alegi per apel.
Motoarele sincrone — heuristic pentru 2D, 1D și lemn, lbf pentru nesting — răspund în interiorul cererii HTTP, determinist, așa că planul din spatele unei oferte este planul din spatele comenzii.
Trimite lucrarea cu engine: "max" și interoghează GET /v1/jobs/{id} pentru rezultat. La panouri 2D caută spre optimul demonstrat; la nesting true-shape cheltuiește un buget de timp (options.timeBudgetMs) căutând mai puține plăci și nu returnează niciodată mai multe decât răspunsul instant.
Răspunsul are aceeași structură în ambele cazuri. La 2D, motorul max acceptă un set mai restrâns de opțiuni decât heuristic (documentația le listează), iar o lucrare de nesting cu zone de excludere este deservită tot de lbf.
Care motor deservește care mod
Endpointul către care faci POST alege modul; parametrul engine alege algoritmul. Motorul implicit heuristic deservește 2D, 1D și lemnul; balanced este doar 2D; motorul asincron max deservește panourile 2D și nestingul true-shape; iar implicit pentru nesting este propriul motor lbf. Același motor ca în aplicație, prin HTTP.
- heuristic — Implicit — un packer guillotine cu strategii multiple. Randament maxim, fiecare layout poate fi tăiat cu ferăstrăul și returnează întotdeauna un plan de tăiere. Deservește 2D, 1D și lemnul.
- balanced — Un free-nester MaxRects opțional pentru 2D. Mult mai rapid pe lucrări foarte mari, cu un randament ușor mai mic, dar layouturile lui adesea nu pot fi tăiate cu ferăstrăul dintr-o margine în alta, așa că nu poartă niciun plan de tăiere.
- max — Nivelul asincron: trimiți lucrarea și interoghezi GET /v1/jobs/{id} pentru rezultat. La 2D este o căutare arborescentă care atinge optimul demonstrat pe mult mai multe lucrări, în câteva secunde până la un minut per rezolvare — rămâne determinist și tăiabil cu ferăstrăul. La nesting true-shape rulează întâi lbf, apoi cheltuiește un buget de timp căutând un aranjament cu mai puține plăci și nu returnează niciodată mai multe; această căutare este limitată în timp, așa că nesturile ei spun deterministic: false.
- lbf — Motorul implicit de nesting true-shape. Împachetează poligoane neregulate în buzunarele unora în ale altora, pentru laser, plasmă și jet de apă — instantaneu și determinist. max (mai sus) poate apoi căuta aceeași lucrare pentru mai puține plăci.
Care endpoint pentru care material: plăci plane — placaj, MDF, sticlă, acril, tablă — merg la /v1/optimize/2d; bare, tuburi, țevi și profile la /v1/optimize/1d; lemn structural (un 50×150 doar dintr-un 50×150) la /v1/optimize/wood; poligoane neregulate pentru laser, plasmă și jet de apă la /v1/optimize/nest.
Un singur apel, un plan complet
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"
}'Răspunsul primit:
{
"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
}Structura completă a cererii și a răspunsului, fiecare opțiune, toate codurile de eroare și toate motoarele:Documentația API → · Ghid de integrare →
Fast sau dens? Alege cu o singură opțiune
Opțiunea effort echilibrează timpul de calcul cu utilizarea. Iată acest compromis, măsurat pe o lucrare solicitantă — fiecare cifră provine din packerul real.
Și oricum este rapid: chiar și cele mai mari lucrări de producție — 2.000 de piese și mai mult — se rezolvă în câteva secunde pe motorul implicit, confortabil în bugetul de timp al API-ului.
Soluții pe industrie
Același motor, poziționat pentru felul în care taie fiecare meserie. Fiecare pagină arată endpointul, o cerere și un răspuns, și câmpurile care contează pentru acel material.
Motorul lucrează cu geometrie, nu cu un catalog de materiale: tablă și plăci metalice, panouri pe bază de lemn, sticlă, plastice și acril, compozite, spumă, carton și hârtie trec toate prin aceleași endpointuri. Materialul schimbă doar numerele pe care le trimiți — kerf-ul sau distanța dintre piese, marginea liberă, dimensiunile materialului de bază.
Nesting după forma reală prin REST: poligoane sau piese DXF/SVG la intrare, poziții și plan DXF/SVG la ieșire. POST /v1/optimize/nest
Debitare 1D la lungime pentru țevi, tuburi și profile tubulare. POST /v1/optimize/1d
Debitare 1D la lungime pentru profile, bare și secțiuni din oțel și aluminiu, cu mod de cost. POST /v1/optimize/1d
2D de tip ghilotină, trasare și rupere fără kerf pentru sticlă float, securizată și oglinzi. POST /v1/optimize/2d
Debitare 1D la lungime pentru cherestea structurală, cu potrivirea secțiunii transversale. POST /v1/optimize/wood
Nesting true-shape pentru poligoane neregulate, cu zone de excludere. POST /v1/optimize/nest
Nesting true-shape pe tablă pentru laser, plasmă sau jet de apă. POST /v1/optimize/nest
Optimizarea extrasului de fasonare pentru oțel-beton. · căutăm parteneri de proiectare
The why, what and how of the CutOptim Engine API on two pages — the four modes, a real request and its plan, how to try it free, and the two plans. Print-ready, with a QR back to this page.