CutOptim Engine API
Une API d’optimisation de découpe : envoyez les pièces et le stock — panneaux 2D, barres 1D, bois ou imbrication à forme réelle de pièces irrégulières — et récupérez la disposition, le plan de découpe et le rendement. Par défaut, la même requête renvoie toujours le même plan.
Voir le benchmark complet → · Mesuré, pas revendiqué
{
"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 }
}Pourquoi construire dessus
Une même entrée renvoie toujours le même résultat — aucun aléatoire, aucune horloge dans l'algorithme. Vous pouvez mettre les résultats en cache et les comparer dans vos tests. L'unique exception facultative, la recherche max d'imbrication limitée dans le temps, le déclare dans chaque réponse (deterministic: false).
Pas seulement des rectangles : la séquence de coupes guillotine, les lignes de coupe face aux passes de scie, la longueur sciée, et un indicateur qui dit si le plan est réalisable sur une scie à panneaux.
Trait de scie, délignage par côté, tolérance, mode coût, sens du fil et correspondance du grain, nombre maximal de phases de coupe, minimisation des rotations — les mêmes options que celles de l'application.
Le développer, ou l'appeler
Un optimiseur de découpe ressemble à un projet de week-end, puis se transforme en une longue traîne de cas particuliers : arithmétique du trait de scie et du délignage, stock qui s'épuise, règles de rotation et de grain, dispositions qui doivent être sciables de bord à bord, polygones avec des trous — et une suite de régression qui prouve qu'un changement ne dégrade jamais un plan. L'Engine API, c'est ce travail, déjà fait et mesuré.
Écrire et valider quatre optimiseurs — panneaux 2D guillotine, stock 1D linéaire, bois par section et imbrication à forme réelle — et les maintenir corrects à mesure que vos besoins évoluent. Votre équipe intègre un seul contrat HTTP à la place.
La qualité des plans est publiée, pas seulement affirmée : le benchmark ouvert exécute le moteur sur des jeux d'instances académiques publics et des travaux générés, avec la méthode et les résultats bruts téléchargeables. Exécutez les mêmes instances sur tout autre outil que vous envisagez.
Un prix affiché sur la page, un essai de 14 jours et une clé depuis votre tableau de bord — aucun appel commercial, aucune négociation de licence avant de pouvoir tester. Les endpoints validate ne nécessitent même aucune clé.
Votre modèle de données, votre interface et vos règles de tarification. Les appels synchrones ne stockent rien ; un travail asynchrone max ne conserve son résultat que pendant une courte fenêtre de rétention, le temps de l'interroger. Un objet meta sur une pièce ou un panneau revient à l'identique, pour que le plan se réconcilie avec vos registres.
Besoin d’un écran de commande prêt à l’emploi plutôt que de le développer ?
CutOptim Configurator fonctionne sur ce moteur →Relier votre boutique ou ERP →Tarifs
Chaque requête compte de la même façon — imbrication comprise · Nous vous écrivons à 90 % du quota, puis lorsqu'il est épuisé.
Essayez gratuitement : une clé de démo publique dans la documentation de l'API, et des clés de test de 1,000 requêtes par mois, jamais facturées
Volumes plus importants. 10,000 requêtes par mois correspondent à l'offre standard, ce n'est pas un plafond de ce que nous pouvons faire tourner. S'il vous faut davantage — un volume plus élevé, des clés distinctes pour la préproduction et la production, ou un accord dédié —, indiquez-nous vos chiffres et nous tarifons au cas par cas. Indiquez-nous votre volume →
En vous abonnant, vous acceptez : Engine API Service Terms (en anglais).
Les offres CutOptim habituelles (Gratuit / Pro / Atelier) n'ont aucun lien avec l'API — l'optimiseur intégré à l'application y reste inclus. Voir les tarifs de l'application →
Ce qui entre, ce qui sort
Un vrai travail par mode : en haut le corps de la requête, en dessous le plan renvoyé, dessiné directement à partir de la réponse.
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- Panneaux
- 2
- sheetCount
- Rendement
- 80,31 %
- yieldPct
- Pièces placées
- 36 / 36
- placed
- Lignes de coupe
- 39
- cutLines
- Coût matière
- 77
- totalPrice
Une rangée de meubles bas en aggloméré standard. Les portes gardent leur fil (rotatable: false) ; toutes les autres pièces peuvent tourner.
L'image directement depuis l'API ? En 2D et en nesting, ajoutez "svg" à include et la réponse contient le dessin.
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- Barres
- 6
- rodCount
- Rendement
- 93,94 %
- yieldPct
- Pièces placées
- 28 / 28
- placed
- Coupes
- 28
- cuts
- Coût matière
- 149,4
- totalPrice
Une liste de débit pour un châssis acier dans des barres entières. Chaque barre montre où commencent ses pièces (pos) et ce qui reste (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- Sections
- 2
- sectionCount
- Barres
- 8
- rodCount
- Rendement
- 91,17 %
- yieldPct
- Pièces placées
- 24 / 24
- placed
- Coût matière
- 92,8
- totalPrice
Bois de charpente en deux sections. Chaque section n'est coupée que dans son propre stock et revient avec ses propres totaux.
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 }
}Le nesting n'est pas inclus dans la démo publique — exécutez cet exemple avec une clé de test gratuite. Créer une clé de test gratuite
200 · sheets[].parts- Panneaux
- 1
- sheetCount
- Remplissage
- 56,32 %
- density
- Pièces placées
- 48 / 48
- placed
- Longueur de coupe
- 49 463
- cutLength
- Perçages
- 110
- pierces
Pièces acier découpées au laser : trois envoyées en coordonnées, la bride en fichier SVG (source). Chaque pièce reste hors de la zone de bridage (exclusions) et garde l'écart demandé (minSeparation).
L'image directement depuis l'API ? En 2D et en nesting, ajoutez "svg" à include et la réponse contient le dessin.
Chaque dessin est tracé à partir des coordonnées de la réponse — rien n'est placé à la main. Les quatre travaux sont résolus par le même moteur que l'API, et notre suite de tests les résout à nouveau pour que les chiffres restent exacts.
Ce que fait l'API
Un appel pour chacun : panneaux 2D, barres 1D, bois avec correspondance de section, et imbrication à forme réelle de polygones irréguliers — POST /v1/optimize/2d, /1d, /wood et /nest.
POST /v1/optimize/nest place des polygones arbitraires (avec trous) sur des feuilles fixes, en imbriquant les pièces dans les poches concaves les unes des autres — 6 feuilles là où les mêmes pièces en rectangle englobant en exigent 9. Pour le laser, le plasma et le jet d'eau. Avec, en prime, des zones d'exclusion par feuille (un défaut, une bride).
Étiquetez les pièces et le stock avec un material et l'optimiseur partitionne le travail : chaque material n'est découpé que dans son propre stock. Sur chaque mode ; un récapitulatif par material est renvoyé.
Nommez un type de chant par arête (2D) et la réponse totalise les mètres linéaires par type — par pièce et par commande. Métadonnée : cela ne déplace jamais une pièce.
Nommez les pièces dont le motif doit se prolonger — une façade de tiroir au-dessus de deux portes — dans un ensemble assorti (matchedSets, 2D), et elles sont découpées côte à côte dans une même planche, à un trait de scie d'écart. Chaque membre revient avec son ensemble et sa position, et les exports CSV, SVG et DXF les marquent aussi.
Demandez include:["svg","csv","dxf"] et la réponse porte la disposition sous forme de fichier prêt à l'emploi, en ligne — un dessin SVG 2D autonome, un DXF R12/AC1009 ou une liste de coupe CSV. Aucun stockage, aucun second appel.
Attachez un objet meta — votre numéro d'article ERP, un identifiant de ligne de commande, une référence client — à toute pièce ou ligne de stock, et il revient à l'identique sur chaque pièce placée et chaque panneau/barre, pour que le plan se réconcilie avec votre système.
POST /v1/validate/{2d,1d,wood} valide le schéma du même corps sans le résoudre — sans clé, sans quota. Vérifiez qu'une charge utile ne sera pas rejetée et obtenez des avertissements de faisabilité avant de dépenser un appel.
minimizeCost classe selon la facture totale la plus basse sur les formats de stock tarifés, en les mélangeant ; par défaut, c'est le matériau qui est minimisé. Les deux exécutent le même algorithme guillotine.
Marquez le stock à épuiser en premier, traitez les quantités comme un plafond strict avec respectStock, et signalez les pièces à découper impérativement, qui gagnent la place sur la plaque quand le matériau manque.
Pas seulement des rectangles : la séquence de coupes guillotine avec les positions de butée par étape, les lignes de coupe face aux passes de scie, la longueur sciée, et un indicateur de faisabilité sur scie à panneaux.
kerf, délignage par côté, tolérance, sens du fil, matched sets, maxCutStages et minimisation des rotations — les mêmes options que celles de l'application.
Une même entrée renvoie toujours le même résultat — mettez-le en cache et comparez-le (la recherche max d'imbrication, facultative et limitée dans le temps, indique deterministic: false). Une version de moteur épinglable et un document OpenAPI 3.1 décrivent tout le contrat.
Envoyez un SVG ou un DXF au lieu de coordonnées : parts[].source lit le contour et ses trous dans le dessin, et POST /v1/import/nest découpe d'abord un fichier multi-pièces. Rien n'est conservé — le fichier est analysé en mémoire et disparaît avec la réponse.
Claude Code, Cursor, VS Code et Claude Desktop appellent le moteur comme des outils via https://api.cutoptim.com/mcp, avec la même clé d'API et le même quota que REST. Il tourne aussi en local avec le paquet npm @cutoptim/mcp.
Deux vitesses : devis immédiat, économie de matériau plus tard
La plupart des intégrations ont besoin des deux — une réponse pendant que le client attend, et un plan plus serré quand le travail part sur la machine. Vous choisissez par appel.
Les moteurs synchrones — heuristic pour le 2D, le 1D et le bois, lbf pour l'imbrication — répondent à l'intérieur de la requête HTTP, de façon déterministe, si bien que le plan derrière un devis est le plan derrière la commande.
Envoyez le travail avec engine: "max" et interrogez GET /v1/jobs/{id} pour obtenir le résultat. Sur les panneaux 2D, il recherche l'optimum prouvé ; sur l'imbrication à forme réelle, il consacre un budget de temps (options.timeBudgetMs) à chercher moins de feuilles, sans jamais en renvoyer davantage que la réponse instantanée.
La réponse a la même structure dans les deux cas. En 2D, le moteur max accepte un ensemble d'options plus restreint que heuristic (la documentation les liste), et un travail d'imbrication avec des zones d'exclusion reste servi par lbf.
Quel moteur sert quel mode
L'endpoint que vous appelez en POST choisit le mode ; le paramètre engine choisit l'algorithme. Le moteur heuristic par défaut sert le 2D, le 1D et le bois ; balanced est réservé au 2D ; le moteur asynchrone max sert les panneaux 2D et l'imbrication à forme réelle ; et l'imbrication a pour moteur par défaut son propre moteur lbf. Le même moteur que l'application, en HTTP.
- heuristic — Le moteur par défaut — un packer guillotine multi-stratégies. Rendement maximal, chaque disposition est sciable, et il renvoie toujours un plan de découpe. Il sert le 2D, le 1D et le bois.
- balanced — Un free-nester MaxRects en option pour le 2D. Bien plus rapide sur les très gros travaux pour un rendement légèrement moindre, mais ses dispositions ne peuvent souvent pas être sciées de bord à bord, elles ne portent donc aucun plan de découpe.
- max — Le palier asynchrone : vous soumettez le travail et interrogez GET /v1/jobs/{id} pour le résultat. En 2D, c'est une recherche arborescente qui atteint l'optimum prouvé sur bien plus de travaux, en quelques secondes à une minute par résolution — toujours déterministe et sciable. Sur l'imbrication à forme réelle, il exécute d'abord lbf, puis consacre un budget de temps à chercher une disposition avec moins de feuilles, sans jamais en renvoyer davantage ; cette recherche est limitée dans le temps, ses imbrications indiquent donc deterministic: false.
- lbf — Le moteur par défaut de l'imbrication à forme réelle. Il imbrique des polygones irréguliers dans les poches les uns des autres pour le laser, le plasma et le jet d'eau — instantanément et de façon déterministe. max (ci-dessus) peut ensuite chercher une version du même travail avec moins de feuilles.
Quel endpoint pour quel matériau : les panneaux plats — contreplaqué, MDF, verre, acrylique, tôle — vont vers /v1/optimize/2d ; les barres, tubes, tuyaux et profilés vers /v1/optimize/1d ; le bois de structure (un 50×150 uniquement depuis un 50×150) vers /v1/optimize/wood ; les polygones irréguliers pour le laser, le plasma et le jet d'eau vers /v1/optimize/nest.
Un appel, 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éponse renvoyée :
{
"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
}Structure complète de la requête et de la réponse, toutes les options, tous les codes d'erreur et tous les moteurs :Documentation de l'API → · Guide d'intégration →
Fast ou dense ? Choisissez avec une seule option
L'option effort arbitre entre le temps de calcul et l'utilisation. Voici ce compromis, mesuré sur un travail exigeant — chaque chiffre provient du vrai packer.
Et c'est rapide dans tous les cas : même les plus gros travaux de production — 2 000 pièces et plus — se résolvent en quelques secondes avec le moteur par défaut, largement dans le budget de temps de l'API.
Solutions par secteur
Le même moteur, présenté pour la façon dont un métier découpe. Chaque page montre l'endpoint, une requête et une réponse, ainsi que les champs qui comptent pour ce matériau.
Le moteur travaille sur de la géométrie, pas sur un catalogue de matériaux : tôle et plaque, panneaux à base de bois, verre, plastiques et acrylique, composites, mousse, carton et papier passent tous par les mêmes endpoints. Le matériau ne change que les nombres que vous envoyez — trait de scie ou espacement entre pièces, dégagement de bord, tailles de stock.
Imbrication en forme réelle en REST : polygones ou pièces DXF/SVG en entrée, placements et plan DXF/SVG en sortie. POST /v1/optimize/nest
Découpe 1D à longueur de tubes, tuyaux et profilés creux. POST /v1/optimize/1d
Découpe 1D à longueur de profilés, barres et sections en acier et aluminium, avec mode coût. POST /v1/optimize/1d
Guillotine 2D, incision-rupture sans trait de scie pour verre float, trempé et miroir. POST /v1/optimize/2d
Débit 1D à longueur de bois de structure, avec correspondance de section. POST /v1/optimize/wood
Nesting à forme réelle de polygones irréguliers, avec zones d’exclusion. POST /v1/optimize/nest
Nesting à forme réelle sur tôle pour laser, plasma ou jet d’eau. POST /v1/optimize/nest
Optimisation des listes de cintrage pour l’acier d’armature. · partenaires de conception recherchés
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.