CutOptim Engine API
Una API de optimización de corte: envía piezas y material — paneles 2D, barras 1D, madera o anidado de forma real de piezas irregulares — y recibe la distribución, el plan de corte y el aprovechamiento. Por defecto, la misma solicitud siempre devuelve el mismo plan.
Ver el benchmark completo → · Medido, no afirmado
{
"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 qué construir sobre él
La misma entrada siempre devuelve la misma salida — sin aleatoriedad, sin reloj en el algoritmo. Puedes cachear los resultados y compararlos en las pruebas. La única excepción opcional, la búsqueda max de anidado con tiempo limitado, lo indica en cada respuesta (deterministic: false).
No solo rectángulos: la secuencia de corte por guillotina, líneas de corte frente a pasadas de sierra, la longitud serrada y un indicador que te dice si es fabricable en una seccionadora.
Ancho de corte, refilado por lado, tolerancia, modo coste, dirección de veta y coincidencia de veta, número máximo de fases de corte, minimización de giros — las mismas opciones que ofrece la aplicación.
Constrúyelo, o invócalo
Un optimizador de corte parece un proyecto de fin de semana y se convierte en una larga cola de casos límite: aritmética de kerf y refilado, stock que se agota, reglas de rotación y de veta, distribuciones que deben ser serrables de borde a borde, polígonos con agujeros — y una batería de regresión que demuestre que un cambio nunca empeora un plan. La Engine API es ese trabajo, ya hecho y medido.
Escribir y validar cuatro optimizadores — paneles guillotine 2D, stock lineal 1D, madera por sección transversal y anidado de forma real — y mantenerlos correctos a medida que crecen tus requisitos. Tu equipo integra un único contrato HTTP en su lugar.
La calidad del plan está publicada, no solo declarada: el benchmark abierto ejecuta el motor sobre conjuntos académicos públicos y trabajos generados, con el método y los resultados en bruto descargables. Ejecuta las mismas instancias contra cualquier otra opción que estés considerando.
Un precio en la página, una prueba de 14 días y una clave desde tu panel — sin llamada de ventas ni negociación de licencia antes de poder probarlo. Los endpoints de validate no necesitan clave en absoluto.
Tu modelo de datos, tu interfaz y tus reglas de precios. Las llamadas síncronas no almacenan nada; un job asíncrono max conserva su resultado solo durante una ventana de retención corta para que puedas consultarlo. Un objeto meta en cualquier pieza o tablero vuelve tal cual, así el plan cuadra con tus registros.
¿Prefieres una pantalla de pedido lista en lugar de construirla?
CutOptim Configurator funciona con este motor →Conectar tu tienda o ERP →Precios
Cada solicitud cuenta igual, también el anidado · Te enviamos un correo al llegar al 90 % de la cuota y cuando se agota.
Pruébala gratis: una clave de demostración pública en la referencia de la API y claves de prueba con 1,000 solicitudes al mes que nunca se facturan
Volúmenes mayores. 10,000 solicitudes al mes es el plan estándar, no un techo de lo que podemos ejecutar. Si necesitas más — mayor volumen, claves separadas para staging y producción, o un acuerdo dedicado — dinos tus cifras y lo presupuestamos de forma individual. Cuéntanos tu volumen →
Al suscribirte aceptas: Engine API Service Terms (en inglés).
Los planes habituales de CutOptim (Free / Pro / Taller) no tienen relación con la API — el optimizador integrado en la aplicación sigue incluido en ellos. Ver precios de la aplicación →
Qué entra, qué sale
Un trabajo real por modo: arriba el cuerpo de la petición, debajo el plan devuelto, dibujado directamente a partir de la respuesta.
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- Tableros
- 2
- sheetCount
- Aprovechamiento
- 80,31 %
- yieldPct
- Piezas colocadas
- 36 / 36
- placed
- Líneas de corte
- 39
- cutLines
- Coste de material
- 77
- totalPrice
Una fila de muebles bajos en aglomerado estándar. Las puertas conservan la veta (rotatable: false); el resto de piezas puede girar.
¿La imagen directamente de la API? En 2D y nesting, añade "svg" a include y la respuesta trae el dibujo.
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
- Aprovechamiento
- 93,94 %
- yieldPct
- Piezas colocadas
- 28 / 28
- placed
- Cortes
- 28
- cuts
- Coste de material
- 149,4
- totalPrice
Una lista de corte para un bastidor de acero a partir de barras enteras. Cada barra muestra dónde empiezan sus piezas (pos) y cuánto 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- Secciones
- 2
- sectionCount
- Barras
- 8
- rodCount
- Aprovechamiento
- 91,17 %
- yieldPct
- Piezas colocadas
- 24 / 24
- placed
- Coste de material
- 92,8
- totalPrice
Madera estructural en dos secciones. Cada sección se corta solo de su propio material y vuelve con sus propios totales.
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 }
}El nesting no está incluido en la demo pública — ejecuta este ejemplo con una clave de prueba gratuita. Crear una clave de prueba gratuita
200 · sheets[].parts- Tableros
- 1
- sheetCount
- Ocupación
- 56,32 %
- density
- Piezas colocadas
- 48 / 48
- placed
- Longitud de corte
- 49.463
- cutLength
- Perforaciones
- 110
- pierces
Piezas de acero cortadas por láser: tres enviadas como coordenadas, la brida como archivo SVG (source). Ninguna pieza entra en la zona de sujeción (exclusions) y todas mantienen la separación pedida (minSeparation).
¿La imagen directamente de la API? En 2D y nesting, añade "svg" a include y la respuesta trae el dibujo.
Cada dibujo sale de las coordenadas de la respuesta: nada se coloca a mano. Los cuatro trabajos los resuelve el mismo motor que usa la API, y nuestra batería de pruebas los vuelve a resolver para que las cifras sigan siendo ciertas.
Qué hace la API
Una llamada para cada uno: paneles 2D, material lineal 1D, madera con emparejamiento de sección y anidado de forma real de polígonos irregulares — POST /v1/optimize/2d, /1d, /wood y /nest.
POST /v1/optimize/nest empaqueta polígonos arbitrarios (con holes) en tableros fijos, encajando las piezas en las cavidades cóncavas de las demás — 6 tableros donde las mismas piezas por su bounding box necesitan 9. Para láser, plasma y chorro de agua. Incluye zonas de exclusión por tablero (un defecto, una brida).
Etiqueta las piezas y el stock con un material y el optimizador particiona el trabajo: cada material se corta solo de su propio stock. En todos los modos; se devuelve un resumen por material.
Nombra un tipo de canto por borde (2D) y la respuesta totaliza los metros lineales por tipo — por pieza y por pedido. Metadato: nunca mueve una pieza.
Nombra las piezas cuya veta debe continuar —un frente de cajón sobre dos puertas— en un conjunto (matchedSets, 2D), y se cortan una junto a otra de una misma pieza de tablero, a un kerf de distancia. Cada miembro vuelve con su conjunto y su posición, y las exportaciones CSV, SVG y DXF también los marcan.
Pide include:["svg","csv","dxf"] y la respuesta lleva la distribución como un archivo listo para usar, en línea — un dibujo SVG 2D autónomo, un DXF R12/AC1009 o una lista de corte CSV. Sin almacenamiento, sin una segunda llamada.
Adjunta un objeto meta — el número de artículo de tu ERP, el id de línea de pedido, la referencia del cliente — a cualquier pieza o fila de material y vuelve literalmente en cada pieza colocada y cada sheet/rod, para que el plan cuadre con tu sistema.
POST /v1/validate/{2d,1d,wood} valida el esquema del mismo cuerpo sin resolver — sin clave, sin cuota. Comprueba que una carga útil no será rechazada y obtén avisos de viabilidad antes de gastar una llamada.
minimizeCost ordena por la factura total más baja entre los tamaños de stock con precio, mezclando formatos; por defecto se minimiza el material. Ambos ejecutan el mismo algoritmo guillotine.
Marca el stock que se agota primero, trata las cantidades como un tope estricto con respectStock y señala las piezas de corte obligatorio, que ganan sitio en el tablero cuando el material escasea.
No solo rectángulos: la secuencia de corte guillotine con las posiciones de tope por paso, líneas de corte frente a pasadas de sierra, la longitud serrada y un indicador de fabricabilidad en seccionadora.
kerf, refilado por lado, tolerancia, dirección de veta, matched sets, maxCutStages y minimización de giros — las mismas opciones que ofrece la aplicación.
La misma entrada siempre devuelve la misma salida — cachéala y compárala (la búsqueda max de anidado, opcional y con tiempo limitado, informa deterministic: false). Una versión de motor fijable y un documento OpenAPI 3.1 describen todo el contrato.
Envía un SVG o un DXF en lugar de coordenadas: parts[].source lee el contorno y sus agujeros del dibujo, y POST /v1/import/nest divide antes un archivo con varias piezas. No se almacena nada — el archivo se procesa en memoria y desaparece con la respuesta.
Claude Code, Cursor, VS Code y Claude Desktop llaman al motor como herramientas a través de https://api.cutoptim.com/mcp, con la misma clave de API y la misma cuota que REST. También se ejecuta en local como el paquete npm @cutoptim/mcp.
Dos velocidades: presupuesta ahora, ahorra material después
La mayoría de integraciones necesitan ambas — una respuesta mientras el cliente espera, y un plan más ajustado cuando el trabajo pasa a la máquina. Tú eliges por llamada.
Los motores síncronos — heuristic para 2D, 1D y madera, lbf para el anidado — responden dentro de la propia solicitud HTTP, de forma determinista, así que el plan detrás de un presupuesto es el plan detrás del pedido.
Envía el trabajo con engine: "max" y consulta GET /v1/jobs/{id} para obtener el resultado. En paneles 2D busca hacia el óptimo probado; en el anidado de forma real dedica un presupuesto de tiempo (options.timeBudgetMs) a buscar menos tableros y nunca devuelve más que la respuesta instantánea.
La respuesta tiene la misma forma en ambos casos. En 2D, el motor max acepta un conjunto de opciones más reducido que heuristic (la referencia las enumera), y un trabajo de anidado con zonas de exclusión lo sigue sirviendo lbf.
Qué motor sirve cada modo
El endpoint al que haces POST elige el modo; el parámetro engine elige el algoritmo. El motor heuristic por defecto sirve 2D, 1D y madera; balanced es solo 2D; el motor max asíncrono sirve paneles 2D y el anidado de forma real; y el anidado tiene su propio motor lbf por defecto. El mismo motor que la aplicación, sobre HTTP.
- heuristic — El motor por defecto — un empaquetador guillotine multiestrategia. El mayor aprovechamiento, cada distribución es cortable con sierra y siempre devuelve un plan de corte. Sirve 2D, 1D y madera.
- balanced — Un empaquetador libre MaxRects opcional para 2D. Mucho más rápido en trabajos muy grandes a cambio de un aprovechamiento algo menor, pero sus distribuciones a menudo no pueden cortarse de borde a borde, así que no llevan plan de corte.
- max — El nivel asíncrono: envías el trabajo y consultas GET /v1/jobs/{id} para el resultado. En 2D es una búsqueda en árbol que alcanza el óptimo probado en muchos más trabajos, con un tiempo de segundos a un minuto por resolución — sigue siendo determinista y cortable con sierra. En el anidado de forma real ejecuta primero lbf y luego dedica un presupuesto de tiempo a buscar una distribución con menos tableros, sin devolver nunca más; esa búsqueda tiene un tiempo limitado, así que sus anidados dicen deterministic: false.
- lbf — El motor por defecto del anidado de forma real. Empaqueta polígonos irregulares en las cavidades de las demás piezas para láser, plasma y chorro de agua — de forma instantánea y determinista. max (arriba) puede después buscar en el mismo trabajo una distribución con menos tableros.
Qué endpoint para cada material: los tableros planos — contrachapado, MDF, vidrio, acrílico, chapa metálica — van a /v1/optimize/2d; barras, tubo, tubería y perfil a /v1/optimize/1d; madera estructural (un 50×150 solo a partir de 50×150) a /v1/optimize/wood; polígonos irregulares para láser, plasma y chorro de agua a /v1/optimize/nest.
Una llamada, un plan 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"
}'Devuelve:
{
"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
}La estructura completa de la solicitud y la respuesta, todas las opciones, todos los códigos de error y todos los motores:Referencia de la API → · Guía de integración →
¿Fast o denso? Elige con una sola opción
La opción effort equilibra el tiempo de cálculo frente al aprovechamiento. Aquí está ese compromiso, medido en un trabajo exigente — cada cifra proviene del packer real.
Y en cualquier caso es rápido: incluso los trabajos de producción más grandes — 2000 piezas o más — se resuelven en segundos con el motor predeterminado, holgadamente dentro del presupuesto de tiempo de la API.
Soluciones por sector
El mismo motor, presentado según cómo corta cada oficio. Cada página muestra el endpoint, una solicitud y una respuesta, y los campos que importan para ese material.
El motor trabaja con geometría, no con un catálogo de materiales: chapa y plancha metálica, tableros derivados de la madera, vidrio, plásticos y acrílico, composites, espuma, cartón y papel pasan todos por los mismos endpoints. El material solo cambia los números que envías — kerf o separación entre piezas, holgura de borde, tamaños de stock.
Nesting de forma real por REST: polígonos o piezas DXF/SVG de entrada, posiciones y layout DXF/SVG de salida. POST /v1/optimize/nest
Corte a medida 1D de tubo, tubería y perfil hueco. POST /v1/optimize/1d
Corte a medida 1D de perfil, barra y sección de acero y aluminio, con modo coste. POST /v1/optimize/1d
Guillotina 2D con kerf cero (raya y rotura) para vidrio float, templado y espejo. POST /v1/optimize/2d
Corte a medida 1D de madera estructural con emparejamiento por sección transversal. POST /v1/optimize/wood
Anidado de forma real de polígonos irregulares, con zonas de exclusión. POST /v1/optimize/nest
Anidado de forma real sobre plancha para láser, plasma o chorro de agua. POST /v1/optimize/nest
Optimización de la planilla de doblado de acero de refuerzo (ferralla). · buscamos socios de diseño
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.