CutOptim Engine API
API do optymalizacji cięcia: wyślij elementy i materiał — płyty 2D, pręty 1D, drewno lub nesting kształtów rzeczywistych dla nieregularnych elementów — i odbierz układ, plan cięcia i wykorzystanie materiału. Domyślnie to samo zapytanie zawsze zwraca ten sam plan.
Zobacz pełny benchmark → · Zmierzone, nie deklarowane
{
"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 }
}Dlaczego warto na tym budować
Te same dane wejściowe zawsze zwracają ten sam wynik — żadnej losowości, żadnego zegara w algorytmie. Wyniki możesz buforować i porównywać w testach. Jeden opcjonalny wyjątek, ograniczone czasowo przeszukiwanie max w nestingu, mówi o tym wprost w każdej odpowiedzi (deterministic: false).
Nie tylko prostokąty: gilotynowa sekwencja cięcia, linie cięcia kontra przejścia piły, łączna długość cięcia oraz flaga mówiąca, czy plan da się wykonać na pile panelowej.
Szerokość rzazu, okrawanie każdej krawędzi, tolerancja, tryb kosztowy, kierunek słojów i dopasowanie słojów, maks. etapy cięcia, minimalizacja obrotów — te same opcje, które udostępnia aplikacja.
Zbuduj to sam, albo wywołaj gotowe
Optymalizator cięcia wygląda jak projekt na weekend, a zamienia się w długi ciąg przypadków brzegowych: arytmetyka szerokości rzazu i okrawania, kończący się zapas, reguły obrotu i słoja, układy, które muszą dać się przeciąć od krawędzi do krawędzi, wielokąty z otworami — i zestaw testów regresyjnych, który dowodzi, że żadna zmiana nigdy nie pogarsza planu. Engine API to właśnie ta praca, już wykonana i zmierzona.
Napisanie i zwalidowanie czterech optymalizatorów — gilotynowych płyt 2D, liniowego zapasu 1D, drewna według przekroju i nestingu kształtów rzeczywistych — oraz utrzymanie ich poprawności wraz z rosnącymi wymaganiami. Twój zespół integruje w zamian jeden kontrakt HTTP.
Jakość planów jest opublikowana, nie tylko deklarowana: otwarty benchmark uruchamia silnik na publicznych, akademickich zestawach zadań oraz na zadaniach wygenerowanych, z metodą i surowymi wynikami do pobrania. Uruchom te same zadania na czymkolwiek innym, co rozważasz.
Cena na stronie, 14-dniowy okres próbny i klucz z Twojego panelu — bez rozmowy handlowej i bez negocjacji licencji, zanim zdążysz przetestować. Endpointy walidacji nie wymagają nawet klucza.
Twój model danych, Twój interfejs i Twoje reguły cenowe. Wywołania synchroniczne niczego nie przechowują; asynchroniczne zadanie max trzyma swój wynik tylko przez krótkie okno przechowywania, żeby dało się go odpytać. Obiekt meta dołączony do dowolnego elementu lub płyty wraca niezmieniony, dzięki czemu plan uzgadnia się z Twoją ewidencją.
Wolisz gotowy ekran zamówień zamiast budować własny?
CutOptim Configurator działa na tym silniku →Połącz własny sklep lub ERP →Cennik
Każde zapytanie liczy się tak samo — także nesting · Wyślemy Ci e-mail przy 90% limitu i gdy się skończy.
Wypróbuj za darmo: publiczny klucz demo w dokumentacji API oraz klucze testowe z 1,000 zapytaniami miesięcznie, które nigdy nie są rozliczane
Większe wolumeny. 10,000 zapytań miesięcznie to plan standardowy, a nie granica tego, co jesteśmy w stanie obsłużyć. Jeśli potrzebujesz więcej — wyższego wolumenu, osobnych kluczy dla środowiska testowego i produkcyjnego albo indywidualnego rozwiązania — podaj nam swoje liczby, a wycenimy to indywidualnie. Podaj nam swój wolumen →
Subskrybując, akceptujesz: Engine API Service Terms (po angielsku).
Zwykłe plany CutOptim (Bezpłatny / Pro / Warsztat) nie mają związku z API — optymalizator w aplikacji pozostaje w nich zawarty. Zobacz cennik aplikacji →
Co wchodzi, co wychodzi
Jedno prawdziwe zlecenie na tryb: u góry treść żądania, pod nią zwrócony plan, narysowany wprost z odpowiedzi.
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- Arkusze
- 2
- sheetCount
- Wydajność
- 80,31%
- yieldPct
- Rozmieszczone elementy
- 36 / 36
- placed
- Linie cięcia
- 39
- cutLines
- Koszt materiału
- 77
- totalPrice
Ciąg szafek dolnych z typowej płyty wiórowej. Fronty zachowują kierunek słojów (rotatable: false), pozostałe elementy mogą się obracać.
Chcesz obraz prosto z API? W 2D i nestingu dodaj "svg" do include, a odpowiedź zawiera rysunek.
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- Sztangi
- 6
- rodCount
- Wydajność
- 93,94%
- yieldPct
- Rozmieszczone elementy
- 28 / 28
- placed
- Cięcia
- 28
- cuts
- Koszt materiału
- 149,4
- totalPrice
Lista cięć ramy stalowej z pełnych sztang. Każda sztanga pokazuje, gdzie zaczynają się elementy (pos) i ile zostaje (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- Przekroje
- 2
- sectionCount
- Sztangi
- 8
- rodCount
- Wydajność
- 91,17%
- yieldPct
- Rozmieszczone elementy
- 24 / 24
- placed
- Koszt materiału
- 92,8
- totalPrice
Drewno konstrukcyjne w dwóch przekrojach. Każdy przekrój jest cięty tylko z własnego materiału i wraca z własnymi sumami.
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 nie jest częścią publicznego dema — uruchom ten przykład z darmowym kluczem testowym. Utwórz darmowy klucz testowy
200 · sheets[].parts- Arkusze
- 1
- sheetCount
- Wypełnienie
- 56,32%
- density
- Rozmieszczone elementy
- 48 / 48
- placed
- Długość cięcia
- 49 463
- cutLength
- Przebicia
- 110
- pierces
Stalowe detale cięte laserem: trzy wysłane jako współrzędne, kołnierz jako plik SVG (source). Żaden detal nie wchodzi w strefę docisku (exclusions) i każdy zachowuje zadany odstęp (minSeparation).
Chcesz obraz prosto z API? W 2D i nestingu dodaj "svg" do include, a odpowiedź zawiera rysunek.
Każdy rysunek powstaje ze współrzędnych z odpowiedzi — nic nie jest układane ręcznie. Cztery zlecenia rozwiązuje ten sam silnik, który działa za API, a nasze testy rozwiązują je ponownie, żeby liczby pozostały prawdziwe.
Co robi API
Po jednym wywołaniu dla płyt 2D, materiału liniowego 1D, drewna z dopasowaniem przekroju oraz nestingu kształtów rzeczywistych dla nieregularnych wielokątów — POST /v1/optimize/2d, /1d, /wood i /nest.
POST /v1/optimize/nest pakuje dowolne wielokąty (z otworami) na płytach o stałym rozmiarze, wsuwając elementy we wklęsłe kieszenie sąsiadów — 6 płyt tam, gdzie te same elementy według prostokąta otaczającego potrzebują 9. Do cięcia laserem, plazmą i strumieniem wody. W komplecie strefy wykluczeń na każdą płytę (wada, docisk).
Oznacz elementy i zapas etykietą material, a optymalizator dzieli zadanie: każdy material jest cięty wyłącznie z własnego zapasu. W każdym trybie; zwracane jest podsumowanie na material.
Nazwij typ obrzeża dla każdej krawędzi (2D), a odpowiedź sumuje metry bieżące na typ — na element i na zamówienie. Metadane: nigdy nie przesuwa elementu.
Nazwij elementy, których rysunek słojów ma przechodzić dalej — front szuflady nad dwojgiem drzwi — w zestawie dopasowania (matchedSets, 2D), a zostaną wycięte obok siebie z jednego kawałka płyty, w odstępie jednego rzazu. Każdy członek wraca ze swoim zestawem i pozycją, a eksporty CSV, SVG i DXF także je oznaczają.
Poproś o include:["svg","csv","dxf"], a odpowiedź niesie układ jako gotowy plik, w treści — samodzielny rysunek 2D SVG, plik DXF R12/AC1009 albo listę cięć CSV. Bez magazynowania, bez drugiego wywołania.
Dołącz obiekt meta — numer artykułu z Twojego ERP, identyfikator pozycji zamówienia, referencję klienta — do dowolnego elementu lub wiersza materiału bazowego, a wróci on niezmieniony przy każdym rozmieszczonym kawałku i każdej płycie/pręcie, dzięki czemu plan uzgadnia się z Twoim systemem.
POST /v1/validate/{2d,1d,wood} sprawdza schemat tej samej treści bez rozwiązywania — bez klucza, bez limitu. Upewnij się, że ładunek nie zostanie odrzucony, i otrzymaj ostrzeżenia o wykonalności, zanim zużyjesz wywołanie.
minimizeCost sortuje według najniższego łącznego rachunku wśród wycenionych rozmiarów zapasu, mieszając formaty; domyślnie minimalizowany jest materiał. Oba wykonują ten sam algorytm guillotine.
Oznacz zapas do zużycia w pierwszej kolejności, traktuj ilości jako twardy limit za pomocą respectStock i oznacz elementy do obowiązkowego cięcia, które zdobywają miejsce na płycie, gdy brakuje materiału.
Nie tylko prostokąty: gilotynowa sekwencja cięcia z pozycjami zderzaka na każdy krok, linie cięcia kontra przejścia piły, długość cięcia oraz flaga wykonalności na pile panelowej.
kerf, okrawanie każdej krawędzi, tolerancja, kierunek słojów, matched sets, maxCutStages i minimalizacja obrotów — te same opcje, które udostępnia aplikacja.
Te same dane wejściowe zawsze zwracają ten sam wynik — buforuj je i porównuj (opcjonalne, ograniczone czasowo przeszukiwanie max w nestingu raportuje deterministic: false). Przypinalna wersja silnika oraz dokument OpenAPI 3.1 opisują cały kontrakt.
Wyślij SVG lub DXF zamiast współrzędnych: parts[].source odczytuje obrys i otwory z rysunku, a POST /v1/import/nest najpierw dzieli plik z wieloma elementami. Nic nie jest przechowywane — plik jest przetwarzany w pamięci i znika wraz z odpowiedzią.
Claude Code, Cursor, VS Code i Claude Desktop wywołują silnik jako narzędzia przez https://api.cutoptim.com/mcp — z tym samym kluczem API i limitem co REST. Lokalnie działa też jako pakiet npm @cutoptim/mcp.
Dwie prędkości: wycena od razu, oszczędność materiału później
Większość integracji potrzebuje obu — odpowiedzi, gdy klient czeka, i ciaśniejszego planu, gdy zadanie trafia na maszynę. Wybierasz per wywołanie.
Silniki synchroniczne — heuristic dla 2D, 1D i drewna, lbf dla nestingu — odpowiadają w ramach jednego zapytania HTTP, deterministycznie, więc plan stojący za wyceną to ten sam plan, który stoi za zamówieniem.
Wyślij zadanie z engine: "max" i odpytuj GET /v1/jobs/{id} o wynik. Na płytach 2D przeszukuje w kierunku dowiedzionego optimum; w nestingu kształtów rzeczywistych poświęca budżet czasu (options.timeBudgetMs) na szukanie mniejszej liczby płyt i nigdy nie zwraca ich więcej niż odpowiedź natychmiastowa.
Odpowiedź ma tę samą strukturę w obu przypadkach. W 2D silnik max przyjmuje węższy zestaw opcji niż heuristic (dokumentacja je wymienia), a zadanie nestingu ze strefami wykluczeń nadal obsługuje lbf.
Który silnik obsługuje który tryb
Endpoint, na który wysyłasz POST, wybiera tryb; parametr engine wybiera algorytm. Domyślny silnik heuristic obsługuje 2D, 1D i drewno; balanced działa tylko dla 2D; asynchroniczny silnik max obsługuje płyty 2D i nesting kształtów rzeczywistych; a domyślnym silnikiem nestingu jest jego własny lbf. Ten sam silnik co w aplikacji, przez HTTP.
- heuristic — Domyślny — gilotynowy pakownik wielostrategijny. Najwyższa wydajność, każdy układ da się przeciąć na pile i zawsze zwracany jest plan cięcia. Obsługuje 2D, 1D i drewno.
- balanced — Opcjonalny wolny nester MaxRects dla 2D. Znacznie szybszy przy bardzo dużych zadaniach kosztem nieco niższej wydajności, ale jego układów często nie da się przeciąć od krawędzi do krawędzi, więc nie niosą planu cięcia.
- max — Asynchroniczny poziom: przesyłasz zadanie i odpytujesz GET /v1/jobs/{id} o wynik. W 2D to przeszukiwanie drzewa, które osiąga dowiedzione optimum przy znacznie większej liczbie zadań, w czasie od sekund do minuty na rozwiązanie — nadal deterministyczne i wykonalne na pile. W nestingu kształtów rzeczywistych najpierw uruchamia lbf, a następnie poświęca budżet czasu na szukanie układu z mniejszą liczbą płyt i nigdy nie zwraca ich więcej; to przeszukiwanie jest ograniczone czasowo, więc jego wyniki nestingu mówią deterministic: false.
- lbf — Domyślny silnik nestingu kształtów rzeczywistych. Pakuje nieregularne wielokąty we wzajemne kieszenie do cięcia laserem, plazmą i strumieniem wody — natychmiastowo i deterministycznie. max (powyżej) może następnie przeszukać to samo zadanie w poszukiwaniu mniejszej liczby płyt.
Który endpoint dla którego materiału: płaskie arkusze — sklejka, MDF, szkło, akryl, blacha — trafiają do /v1/optimize/2d; pręty, rury i profile do /v1/optimize/1d; drewno konstrukcyjne (50×150 tylko z 50×150) do /v1/optimize/wood; nieregularne wielokąty do cięcia laserem, plazmą i strumieniem wody do /v1/optimize/nest.
Jedno wywołanie, pełny 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"
}'W odpowiedzi:
{
"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
}Pełna struktura zapytania i odpowiedzi, wszystkie opcje, wszystkie kody błędów i wszystkie silniki:Dokumentacja API → · Przewodnik integracji →
Fast czy gęsto? Wybierz jedną opcją
Opcja effort równoważy czas obliczeń z wykorzystaniem. Oto ten kompromis, zmierzony na jednym wymagającym zleceniu — każda liczba pochodzi z prawdziwego packera.
I tak jest szybko: nawet największe zlecenia produkcyjne — 2000 elementów i więcej — rozwiązywane są w kilka sekund na domyślnym silniku, z zapasem mieszcząc się w budżecie czasu API.
Rozwiązania dla branż
Ten sam silnik, dopasowany do sposobu cięcia w danej branży. Każda strona pokazuje endpoint, przykładowe zapytanie i odpowiedź oraz pola istotne dla danego materiału.
Silnik pracuje na geometrii, nie na katalogu materiałów: blacha i płyta metalowa, płyty drewnopochodne, szkło, tworzywa sztuczne i akryl, kompozyty, pianka, karton i papier — wszystko przechodzi przez te same endpointy. Materiał zmienia tylko liczby, które wysyłasz — szerokość rzazu lub odstęp między elementami, prześwit od krawędzi, rozmiary zapasu.
Nesting kształtowy przez REST: wielokąty lub detale DXF/SVG na wejściu, rozmieszczenie i układ DXF/SVG na wyjściu. POST /v1/optimize/nest
Cięcie rur, rurek i profili zamkniętych na długość (1D). POST /v1/optimize/1d
Cięcie profili stalowych i aluminiowych, prętów i kształtowników na długość (1D), z trybem kosztowym. POST /v1/optimize/1d
Gilotynowe 2D, rzaz zero (nacinanie i łamanie) dla szkła float, hartowanego i lustra. POST /v1/optimize/2d
Cięcie drewna konstrukcyjnego na długość (1D) z dopasowaniem przekroju. POST /v1/optimize/wood
Nesting kształtów rzeczywistych nieregularnych wielokątów, ze strefami wykluczeń. POST /v1/optimize/nest
Nesting kształtów rzeczywistych na blachach dla lasera, plazmy i strumienia wody. POST /v1/optimize/nest
Optymalizacja zestawień gięcia prętów dla stali zbrojeniowej. · szukamy partnerów projektowych
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.