CutOptim Engine API
Uma API de otimização de corte: envie peças e estoque — painéis 2D, barras 1D, madeira ou nesting de peças irregulares pela forma real — e receba o layout, o plano de corte e o aproveitamento. Por padrão a mesma requisição sempre devolve o mesmo plano.
Ver o benchmark completo (EN) → · Medido, não alegado
{
"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 }
}Por que construir sobre ele
A mesma entrada sempre devolve a mesma saída — sem aleatoriedade, sem relógio no algoritmo. Você pode guardar resultados em cache e compará-los em testes. A única exceção opcional, a busca max de nesting limitada por tempo, avisa isso em toda resposta (deterministic: false).
Não só retângulos: a sequência de cortes guilhotina, linhas de corte vs. passadas de serra, comprimento serrado e um indicador de que o plano é executável numa seccionadora.
Espessura da serra, refilo por lado, tolerância, modo de custo, sentido do veio e casamento de veio, número máximo de estágios de corte, minimização de rotações — as mesmas opções que o app oferece.
Construir ou chamar a API
Um otimizador de corte parece um projeto de fim de semana e vira uma longa cauda de casos-limite: a aritmética de espessura de serra e refilo, estoque que acaba, regras de rotação e veio, layouts que precisam ser serráveis de ponta a ponta, polígonos com furos — e uma suíte de regressão que prove que uma mudança nunca piora um plano. A Engine API é esse trabalho, já feito e medido.
Escrever e validar quatro otimizadores — painéis 2D guilhotina, estoque linear 1D, madeira por seção e nesting pela forma real — e mantê-los corretos conforme os requisitos crescem. A sua equipe integra um único contrato HTTP.
A qualidade do plano é publicada, não alegada: o benchmark aberto roda o motor em conjuntos acadêmicos públicos e em trabalhos gerados, com o método e os resultados brutos para baixar. Rode as mesmas instâncias contra qualquer outra opção que estiver avaliando.
Um preço na página, um teste de 14 dias e uma chave no seu painel — sem ligação de vendas e sem negociação de licença antes de testar. Os endpoints de validação nem precisam de chave.
O seu modelo de dados, a sua interface e as suas regras de preço. Chamadas síncronas não armazenam nada; um trabalho assíncrono max guarda o resultado só por um curto período de retenção, para você consultá-lo. Um objeto meta em qualquer peça ou chapa volta intacto, para o plano bater com os seus registros.
Ver o benchmark completo (EN) →
Precisa de uma tela de pedidos pronta em vez de construir uma?
O CutOptim Configurator roda neste motor →Conecte a sua loja ou ERP (EN) →Preços
Toda requisição conta igual — nesting incluído · Enviamos um e-mail quando você atinge 90% da cota e quando ela acaba.
Teste grátis: uma chave de demonstração pública na referência da API e chaves de teste com 1,000 requisições por mês que nunca são cobradas
Volumes maiores. 10,000 requisições por mês é o plano padrão, não um teto do que conseguimos rodar. Se precisar de mais — volume maior, chaves separadas para homologação e produção, ou um acordo dedicado — conte os seus números e fazemos um preço individual. Conte o seu volume →
Ao assinar, você aceita os Termos de Serviço da Engine API (em inglês).
Os planos normais do CutOptim (Free / Pro / Workshop) não têm relação com a API — o otimizador do app continua incluído neles. Ver os preços do app →
O que entra, o que sai
Um trabalho real por modo: o corpo da requisição em cima e, embaixo, o plano que voltou, desenhado direto da resposta.
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- Chapas
- 2
- sheetCount
- Aproveitamento
- 80,31%
- yieldPct
- Peças posicionadas
- 36 / 36
- placed
- Linhas de corte
- 39
- cutLines
- Custo do material
- 77
- totalPrice
Uma linha de armários de base em MDP padrão. As portas mantêm o veio (rotatable: false); todas as outras peças podem girar.
Quer a imagem direto da API? Em 2D e nesting, adicione "svg" ao include e a resposta traz o desenho.
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- Barras
- 6
- rodCount
- Aproveitamento
- 93,94%
- yieldPct
- Peças posicionadas
- 28 / 28
- placed
- Cortes
- 28
- cuts
- Custo do material
- 149,4
- totalPrice
Uma lista de corte de estrutura metálica a partir de barras inteiras. Cada barra mostra onde começam as peças (pos) e o que sobra (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- Seções
- 2
- sectionCount
- Barras
- 8
- rodCount
- Aproveitamento
- 91,17%
- yieldPct
- Peças posicionadas
- 24 / 24
- placed
- Custo do material
- 92,8
- totalPrice
Madeira de estrutura em duas seções. Cada seção é cortada só do próprio estoque e volta com os seus próprios totais.
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 }
}O nesting não está na demonstração pública — rode este exemplo com uma chave de teste grátis. Criar uma chave de teste grátis
200 · sheets[].parts- Chapas
- 1
- sheetCount
- Preenchimento
- 56,32%
- density
- Peças posicionadas
- 48 / 48
- placed
- Comprimento de corte
- 49.463
- cutLength
- Perfurações
- 110
- pierces
Peças de aço cortadas a laser: três enviadas como coordenadas, o flange como arquivo SVG (source). Toda peça fica fora da zona do grampo (exclusions) e mantém o espaçamento pedido (minSeparation).
Quer a imagem direto da API? Em 2D e nesting, adicione "svg" ao include e a resposta traz o desenho.
Todo desenho é feito com as coordenadas da resposta — nada é posicionado à mão. Os quatro trabalhos são resolvidos pelo mesmo motor que a API roda, e a nossa suíte de testes os resolve de novo para os números continuarem verdadeiros.
O que a API faz
Uma chamada para cada: painéis 2D, estoque linear 1D, madeira com casamento de seção e nesting de polígonos irregulares pela forma real — POST /v1/optimize/2d, /1d, /wood e /nest.
POST /v1/optimize/nest encaixa polígonos arbitrários (com furos) em chapas fixas, intercalando as peças nas reentrâncias umas das outras — 6 chapas onde as mesmas peças pelo retângulo envolvente precisam de 9. Para laser, plasma e jato d’água. Zonas de exclusão por chapa (um defeito, um grampo) vêm junto.
Marque peças e estoque com um material e o otimizador divide o trabalho: cada material é cortado só do próprio estoque. Em todos os modos; volta um resumo por material.
Indique um tipo de fita por borda (2D) e a resposta soma os metros por tipo — por peça e por pedido. São metadados: nunca movem uma peça.
Indique as peças cujo desenho deve continuar — uma frente de gaveta sobre duas portas — num conjunto casado (matchedSets, 2D), e elas são cortadas lado a lado de um mesmo pedaço de chapa, a uma espessura de serra uma da outra. Cada membro volta com o seu conjunto e posição, e as exportações CSV, SVG e DXF também os marcam.
Peça include:["svg","csv","dxf"] e a resposta traz o layout como arquivo pronto, inline — um desenho SVG 2D independente, um DXF R12/AC1009 ou uma lista de corte CSV. Sem armazenamento, sem segunda chamada.
Anexe um objeto meta — o código do item no seu ERP, o id da linha do pedido, a referência do cliente — a qualquer peça ou linha de estoque e ele volta intacto em cada peça posicionada e em cada chapa ou barra, para o plano bater com o seu sistema.
POST /v1/validate/{2d,1d,wood,nest} valida o mesmo corpo pelo schema sem resolver — sem chave, sem cota. Confirme que um payload não será recusado e receba avisos de viabilidade antes de gastar uma chamada.
minimizeCost ordena pelo menor custo total entre tamanhos de estoque com preço, misturando formatos; o padrão minimiza o material. Os dois usam o mesmo algoritmo guilhotina.
Marque o estoque a ser usado primeiro, trate as quantidades como limite rígido com respectStock e marque peças obrigatórias que ganham espaço na chapa quando falta material.
Não só retângulos: a sequência de cortes guilhotina com as posições de batente de cada passo, linhas de corte vs. passadas de serra, comprimento serrado e um indicador de execução numa seccionadora.
kerf, refilo por lado, tolerância, sentido do veio, conjuntos casados, maxCutStages e minimização de rotações — as mesmas opções que o app oferece.
A mesma entrada sempre devolve a mesma saída — guarde em cache e compare (a busca max de nesting, opcional e limitada por tempo, informa deterministic: false). Uma versão de motor fixável e um documento OpenAPI 3.1 descrevem todo o contrato.
Envie um SVG ou DXF em vez de coordenadas: parts[].source lê o contorno e os furos do desenho, e POST /v1/import/nest separa antes um arquivo com várias peças. Nada é armazenado — o arquivo é lido na memória e some com a resposta.
Claude Code, Cursor, VS Code e Claude Desktop chamam o motor como ferramentas através de https://api.cutoptim.com/mcp, com a mesma chave de API e a mesma cota do REST. Também roda localmente como o pacote npm @cutoptim/mcp.
Duas velocidades: orce agora, economize material depois
A maioria das integrações precisa das duas — uma resposta enquanto o cliente espera e um plano mais apertado quando o trabalho vai para a máquina. Você escolhe a cada chamada.
Os motores síncronos — heuristic para 2D, 1D e madeira, lbf para nesting — respondem dentro da requisição HTTP, de forma determinística, então o plano por trás do orçamento é o plano por trás do pedido.
Envie o trabalho com engine: "max" e consulte GET /v1/jobs/{id} até o resultado. Em painéis 2D ele busca o ótimo comprovado; no nesting pela forma real usa um orçamento de tempo (options.timeBudgetMs) procurando menos chapas e nunca devolve mais que a resposta imediata.
A resposta tem o mesmo formato nos dois casos. Em 2D o motor max aceita um conjunto mais restrito de opções que o heuristic (a referência as lista), e um nesting com zonas de exclusão continua sendo atendido pelo lbf.
Qual motor atende cada modo
O endpoint para o qual você faz o POST escolhe o modo; o parâmetro engine escolhe o algoritmo. O motor padrão heuristic atende 2D, 1D e madeira; balanced é só 2D; o motor assíncrono max atende painéis 2D e nesting pela forma real; e o nesting usa por padrão o seu próprio motor lbf. O mesmo motor do app, via HTTP.
- heuristic — O padrão — um empacotador guilhotina com várias estratégias. Maior aproveitamento, todo layout é cortável na serra e sempre devolve um plano de corte. Atende 2D, 1D e madeira.
- balanced — Um nester livre MaxRects opcional para 2D. Muito mais rápido em trabalhos muito grandes, com aproveitamento um pouco menor, mas os layouts muitas vezes não podem ser serrados de ponta a ponta, então não trazem plano de corte.
- max — O nível assíncrono: você envia o trabalho e consulta GET /v1/jobs/{id} até o resultado. Em 2D é uma busca em árvore que chega ao ótimo comprovado em muito mais trabalhos, com segundos a um minuto por solução — ainda determinística e cortável na serra. No nesting pela forma real roda primeiro o lbf, depois usa um orçamento de tempo procurando um layout com menos chapas e nunca devolve mais; essa busca é limitada por tempo, então os seus nestings informam deterministic: false.
- lbf — O padrão do nesting pela forma real. Encaixa polígonos irregulares nas reentrâncias uns dos outros para laser, plasma e jato d’água — na hora e de forma determinística. O max (acima) pode então buscar o mesmo trabalho com menos chapas.
Qual endpoint para qual material: chapas planas — compensado, MDF, vidro, acrílico, chapa metálica — vão para /v1/optimize/2d; barras, tubos e perfis para /v1/optimize/1d; madeira estrutural (um 50×150 só de 50×150) para /v1/optimize/wood; polígonos irregulares para laser, plasma e jato d’água para /v1/optimize/nest.
Uma chamada, um plano 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"
}'Volta como:
{
"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
}Formato completo de requisição e resposta, cada opção, todos os códigos de erro e todos os motores:Referência da API (EN) → · Guia de integração (EN) →
Rápido ou denso? Escolha com uma opção
A opção effort troca tempo de solução por aproveitamento. Aqui está essa troca, medida num trabalho exigente — cada número vem do empacotador real.
E é rápido de qualquer jeito: até os maiores trabalhos de produção — 2.000 peças ou mais — resolvem em poucos segundos no motor padrão, folgadamente dentro do orçamento de tempo da API.
Soluções por setor
O mesmo motor, posicionado para o jeito de cortar de cada setor. Cada página (em inglês) mostra o endpoint, uma requisição e uma resposta, e os campos que importam para aquele material.
O motor trabalha com geometria, não com um catálogo de materiais: chapa metálica, painéis de madeira, vidro, plásticos e acrílico, compósitos, espuma, papelão e papel passam pelos mesmos endpoints. O material só muda os números que você envia — espessura de serra ou espaçamento entre peças, folga da borda, medidas de estoque.
Nesting pela forma real via REST: entram polígonos ou peças DXF/SVG, saem as posições e um layout DXF/SVG. POST /v1/optimize/nest
Corte 1D no comprimento para tubos e perfis ocos. POST /v1/optimize/1d
Corte 1D no comprimento para perfis, barras e seções de aço e alumínio, com modo de custo. POST /v1/optimize/1d
Guilhotina 2D sem espessura de corte (riscar e quebrar) para vidro float, temperado e espelho. POST /v1/optimize/2d
Corte 1D no comprimento para madeira estrutural com casamento de seção. POST /v1/optimize/wood
Nesting de polígonos irregulares pela forma real, com zonas de exclusão. POST /v1/optimize/nest
Nesting pela forma real em chapas para laser, plasma ou jato d’água. POST /v1/optimize/nest
Otimização da tabela de corte e dobra de armaduras. · procuramos parceiros
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.