CutOptim Engine API
Un’API per l’ottimizzazione del taglio: invia pezzi e materiale — pannelli 2D, barre 1D, legno o nesting true-shape di pezzi irregolari — e ricevi lo schema, il piano di taglio e l’utilizzo. Di default la stessa richiesta restituisce sempre lo stesso piano.
Guarda il benchmark completo → · Misurato, non dichiarato
{
"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 }
}Perché svilupparci sopra
Lo stesso input restituisce sempre lo stesso output — nessuna casualità, nessun orologio nell’algoritmo. Puoi mettere in cache i risultati e confrontarne le differenze nei test. L’unica eccezione opt-in, la ricerca max per il nesting limitata nel tempo, lo dichiara in ogni risposta (deterministic: false).
Non solo rettangoli: la sequenza di taglio guillotine, le linee di taglio rispetto ai passaggi della lama, la lunghezza di taglio e un flag che dice se è realizzabile su una sezionatrice.
Spessore della lama, rifilo per lato, tolleranza, modalità costo, direzione della venatura e corrispondenza venatura, numero massimo di fasi di taglio, minimizzazione delle rotazioni — le stesse opzioni che offre l’app.
Scrivilo tu, oppure richiamalo
Un ottimizzatore di taglio sembra un progetto da weekend, poi diventa una lunga coda di casi limite: aritmetica di spessore lama e rifilo, stock che si esaurisce, regole di rotazione e venatura, layout che devono essere tagliabili bordo a bordo, poligoni con fori — e una suite di regressione che dimostri che una modifica non peggiora mai un piano. L’Engine API è questo lavoro, già fatto e misurato.
Scrivere e validare quattro ottimizzatori — pannelli guillotine 2D, stock lineare 1D, legno per sezione e nesting true-shape — e mantenerli corretti man mano che crescono i tuoi requisiti. Il tuo team integra invece un unico contratto HTTP.
La qualità dei piani è pubblicata, non dichiarata: il benchmark aperto esegue il motore su set di istanze accademiche pubbliche e su lavori generati, con metodo e risultati grezzi scaricabili. Esegui le stesse istanze su qualsiasi altra soluzione tu stia valutando.
Un prezzo in pagina, una prova di 14 giorni e una chiave dalla tua dashboard — nessuna chiamata commerciale e nessuna trattativa di licenza prima di poter testare. Gli endpoint validate non richiedono nemmeno una chiave.
Il tuo modello dati, la tua UI e le tue regole di prezzo. Le chiamate sincrone non memorizzano nulla; un lavoro max asincrono conserva il risultato solo per una breve finestra di conservazione, così puoi interrogarlo. Un oggetto meta su qualsiasi pezzo o lastra torna invariato, così il piano si riconcilia con i tuoi archivi.
Guarda il benchmark completo →
Preferisci un’interfaccia d’ordine pronta invece di costruirne una?
CutOptim Configurator funziona su questo motore →Collega la tua piattaforma o ERP →Prezzi
Ogni richiesta conta allo stesso modo — nesting compreso · Ti scriviamo al 90% della quota e quando è esaurita.
Provala gratis: una chiave demo pubblica nel riferimento API e chiavi di test con 1,000 richieste al mese, mai fatturate
Volumi maggiori. 10,000 richieste al mese sono il piano standard, non il limite di ciò che possiamo far girare. Se ti serve di più — un volume più alto, chiavi separate per staging e produzione, o un accordo dedicato — dicci i tuoi numeri e lo quotiamo individualmente. Dicci il tuo volume →
Abbonandoti accetti: Engine API Service Terms (in inglese).
I normali piani CutOptim (Gratuito / Pro / Officina) non hanno alcun legame con l’API — l’ottimizzatore integrato nell’app resta incluso in essi. Vedi i prezzi dell’app →
Cosa entra, cosa esce
Un lavoro reale per ogni modalità: sopra il corpo della richiesta, sotto il piano restituito, disegnato direttamente dalla risposta.
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- Pannelli
- 2
- sheetCount
- Resa
- 80,31%
- yieldPct
- Pezzi piazzati
- 36 / 36
- placed
- Linee di taglio
- 39
- cutLines
- Costo materiale
- 77
- totalPrice
Una fila di basi cucina in truciolare standard. Le ante mantengono la venatura (rotatable: false); tutti gli altri pezzi possono ruotare.
Vuoi l'immagine direttamente dall'API? Per 2D e nesting aggiungi "svg" a include e la risposta contiene il disegno.
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- Barre
- 6
- rodCount
- Resa
- 93,94%
- yieldPct
- Pezzi piazzati
- 28 / 28
- placed
- Tagli
- 28
- cuts
- Costo materiale
- 149,4
- totalPrice
Una distinta di taglio per un telaio in acciaio da barre intere. Ogni barra mostra dove iniziano i pezzi (pos) e quanto avanza (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- Sezioni
- 2
- sectionCount
- Barre
- 8
- rodCount
- Resa
- 91,17%
- yieldPct
- Pezzi piazzati
- 24 / 24
- placed
- Costo materiale
- 92,8
- totalPrice
Legname strutturale in due sezioni. Ogni sezione viene tagliata solo dal proprio materiale e torna con i propri totali.
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 }
}Il nesting non è incluso nella demo pubblica — esegui questo esempio con una chiave di test gratuita. Crea una chiave di test gratuita
200 · sheets[].parts- Pannelli
- 1
- sheetCount
- Riempimento
- 56,32%
- density
- Pezzi piazzati
- 48 / 48
- placed
- Lunghezza di taglio
- 49.463
- cutLength
- Sfondamenti
- 110
- pierces
Pezzi in acciaio tagliati al laser: tre inviati come coordinate, la flangia come file SVG (source). Ogni pezzo resta fuori dalla zona di bloccaggio (exclusions) e mantiene la distanza richiesta (minSeparation).
Vuoi l'immagine direttamente dall'API? Per 2D e nesting aggiungi "svg" a include e la risposta contiene il disegno.
Ogni disegno nasce dalle coordinate della risposta: niente è posizionato a mano. I quattro lavori sono risolti dallo stesso motore che usa l'API, e la nostra suite di test li risolve di nuovo perché i numeri restino veri.
Cosa fa l’API
Una chiamata per ciascuna: pannelli 2D, materiale lineare 1D, legno con corrispondenza di sezione e nesting true-shape di poligoni irregolari — POST /v1/optimize/2d, /1d, /wood e /nest.
POST /v1/optimize/nest dispone poligoni arbitrari (con holes) su pannelli fissi, incastrando i pezzi nelle rientranze concave gli uni degli altri — 6 pannelli dove gli stessi pezzi per bounding box ne richiedono 9. Per laser, plasma e getto d’acqua. Le zone di esclusione per pannello (un difetto, un morsetto) sono comprese.
Etichetta pezzi e stock con un material e l’ottimizzatore partiziona il lavoro: ogni material viene tagliato solo dal proprio stock. Su ogni modalità; torna un riepilogo per material.
Assegna un tipo di bordo per lato (2D) e la risposta totalizza i metri lineari per tipo — per pezzo e per ordine. Metadato: non sposta mai un pezzo.
Indica i pezzi la cui figura deve proseguire — un frontale di cassetto sopra due ante — in un set con corrispondenza venatura (matchedSets, 2D): vengono tagliati affiancati da un unico pezzo di pannello, a un kerf di distanza. Ogni membro torna con il proprio set e la propria posizione, e anche gli export CSV, SVG e DXF li contrassegnano.
Chiedi include:["svg","csv","dxf"] e la risposta trasporta lo schema come file già pronto, inline — un disegno SVG 2D autonomo, un DXF R12/AC1009 o una distinta di taglio CSV. Nessuna archiviazione, nessuna seconda chiamata.
Allega un oggetto meta — il codice articolo del tuo ERP, l’id della riga d’ordine, il riferimento cliente — a qualsiasi pezzo o riga di materiale e torna invariato su ogni pezzo posizionato e su ogni sheet/rod, così il piano si riconcilia con il tuo sistema.
POST /v1/validate/{2d,1d,wood} valida lo schema dello stesso corpo senza risolvere — nessuna chiave, nessuna quota. Verifica che un payload non venga rifiutato e ottieni avvisi di fattibilità prima di spendere una chiamata.
minimizeCost ordina in base alla spesa totale più bassa tra i formati di stock con prezzo, mescolandoli; l’impostazione predefinita minimizza il materiale. Entrambi eseguono lo stesso algoritmo guillotine.
Segna lo stock da esaurire per primo, tratta le quantità come un limite rigido con respectStock e contrassegna i pezzi da tagliare obbligatoriamente, che vincono lo spazio sulla lastra quando il materiale scarseggia.
Non solo rettangoli: la sequenza di taglio guillotine con le posizioni di battuta per ogni passo, le linee di taglio rispetto ai passaggi della lama, la lunghezza di taglio e un flag di producibilità su sezionatrice.
kerf, rifilo per lato, tolleranza, direzione della venatura, set con corrispondenza venatura, maxCutStages e minimizzazione delle rotazioni — le stesse opzioni che offre l’app.
Lo stesso input restituisce sempre lo stesso output — mettilo in cache e confrontalo (la ricerca max per il nesting, opt-in e limitata nel tempo, riporta deterministic: false). Una versione di motore fissabile e un documento OpenAPI 3.1 descrivono l’intero contratto.
Invia un SVG o un DXF invece delle coordinate: parts[].source legge il contorno e i suoi fori dal disegno, e POST /v1/import/nest divide prima un file con più pezzi. Nulla viene memorizzato — il file è analizzato in memoria e sparisce con la risposta.
Claude Code, Cursor, VS Code e Claude Desktop chiamano il motore come strumenti tramite https://api.cutoptim.com/mcp, con la stessa chiave API e la stessa quota del REST. Gira anche in locale come pacchetto npm @cutoptim/mcp.
Due velocità: preventiva subito, risparmia materiale dopo
La maggior parte delle integrazioni ha bisogno di entrambe — una risposta mentre il cliente aspetta, e un piano più stretto quando il lavoro va in macchina. Scegli chiamata per chiamata.
I motori sincroni — heuristic per 2D, 1D e legno, lbf per il nesting — rispondono all’interno della richiesta HTTP, in modo deterministico, così il piano dietro un preventivo è il piano dietro l’ordine.
Invia il lavoro con engine: "max" e interroga GET /v1/jobs/{id} per il risultato. Sui pannelli 2D cerca l’ottimo dimostrato; sul nesting true-shape impiega un budget di tempo (options.timeBudgetMs) cercando meno pannelli e non ne restituisce mai più della risposta istantanea.
La risposta ha la stessa struttura in entrambi i casi. Sul 2D il motore max accetta un insieme di opzioni più ristretto rispetto a heuristic (il riferimento le elenca), e un lavoro di nesting con zone di esclusione è comunque servito da lbf.
Quale motore serve quale modalità
L’endpoint su cui fai POST sceglie la modalità; il parametro engine sceglie l’algoritmo. Il motore heuristic predefinito serve 2D, 1D e legno; balanced è solo 2D; il motore asincrono max serve i pannelli 2D e il nesting true-shape; e il predefinito del nesting è il proprio motore lbf. Lo stesso motore dell’app, via HTTP.
- heuristic — Il predefinito — un packer guillotine multi-strategia. Resa massima, ogni layout è tagliabile su sega e restituisce sempre un piano di taglio. Serve 2D, 1D e legno.
- balanced — Un free-nester MaxRects opt-in per il 2D. Molto più veloce sui lavori molto grandi a fronte di una resa leggermente inferiore, ma i suoi layout spesso non possono essere segati da bordo a bordo, quindi non trasportano un piano di taglio.
- max — Il livello asincrono: invii il lavoro e interroghi GET /v1/jobs/{id} per il risultato. Sul 2D è una ricerca ad albero che raggiunge l’ottimo dimostrato su molti più lavori, con qualche secondo fino a un minuto per risoluzione — sempre deterministico e tagliabile su sega. Sul nesting true-shape esegue prima lbf, poi impiega un budget di tempo cercando uno schema con meno pannelli e non ne restituisce mai di più; quella ricerca è limitata nel tempo, quindi i suoi nest dichiarano deterministic: false.
- lbf — Il predefinito per il nesting true-shape. Incastra poligoni irregolari nelle rientranze gli uni degli altri per laser, plasma e getto d’acqua — istantaneamente e in modo deterministico. max (sopra) può poi cercare lo stesso lavoro per meno pannelli.
Quale endpoint per quale materiale: lastre piane — compensato, MDF, vetro, acrilico, lamiera — vanno a /v1/optimize/2d; barre, tubi, tubolari e profili a /v1/optimize/1d; legno strutturale (un 50×150 solo da un 50×150) a /v1/optimize/wood; poligoni irregolari per laser, plasma e getto d’acqua a /v1/optimize/nest.
Una chiamata, un piano completo
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"
}'Torna così:
{
"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
}Struttura completa di richiesta e risposta, tutte le opzioni, tutti i codici di errore e tutti i motori:Riferimento API → · Guida all'integrazione →
Fast o denso? Scegli con un'unica opzione
L'opzione effort bilancia il tempo di calcolo con l'utilizzo. Ecco questo compromesso, misurato su un lavoro impegnativo — ogni cifra proviene dal packer reale.
Ed è comunque veloce: anche i lavori di produzione più grandi — 2.000 pezzi e oltre — si risolvono in pochi secondi con il motore predefinito, ben entro il budget di tempo dell'API.
Soluzioni per settore
Lo stesso motore, presentato secondo il modo di tagliare di ogni settore. Ogni pagina mostra l’endpoint, una richiesta e una risposta, e i campi che contano per quel materiale.
Il motore lavora sulla geometria, non su un catalogo di materiali: lamiera e lastre metalliche, pannelli a base legno, vetro, plastica e acrilico, compositi, schiuma, cartone e carta passano tutti attraverso gli stessi endpoint. Il materiale cambia solo i numeri che invii — spessore lama o distanza tra pezzi, margine dal bordo, dimensioni dello stock.
Nesting a forma reale via REST: poligoni o pezzi DXF/SVG in ingresso, posizionamenti e layout DXF/SVG in uscita. POST /v1/optimize/nest
Taglio a misura 1D per tubi, condotte e tubolari. POST /v1/optimize/1d
Taglio a misura 1D per profili e barre in acciaio e alluminio, con modalità costo. POST /v1/optimize/1d
Guillotine 2D, incisione e rottura a kerf zero per vetro float, temperato e specchio. POST /v1/optimize/2d
Taglio a misura 1D del legname strutturale con abbinamento della sezione. POST /v1/optimize/wood
Nesting true-shape di poligoni irregolari, con zone di esclusione. POST /v1/optimize/nest
Nesting true-shape su piastra per laser, plasma o getto d’acqua. POST /v1/optimize/nest
Ottimizzazione della distinta di piegatura per l’acciaio da armatura. · cerchiamo partner di progettazione
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.