API
Envoie un fichier et une configuration, et nous te renvoyons le prix immédiatement : impression 3D et découpe laser d’acrylique. C’est le même moteur qui calcule les prix sur le site, donc si tu as des tarifs convenus, ils sont appliqués.
Commencer
Il te faut un compte et une clé. La clé se crée depuis Compte → Clés API et n’est affichée qu’une seule fois : nous ne la stockons pas en clair, donc si tu la perds, il faut la révoquer et en créer une autre.
Tout passe par HTTPS et répond en JSON. Les requêtes avec un corps l’attendent en JSON et avec Content-Type: application/json ; celles qui contiennent un fichier, en multipart.
Pour vérifier que la clé fonctionne, n’importe quel endpoint convient :
curl https://haztupieza.es/api/v1/orders \
-H "Authorization: Bearer htp_TU_CLAVE"Obtenir un devis
Demander un devis est gratuit et ne crée rien : ni devis enregistré, ni panier, ni commande. Tu peux appeler l’endpoint en boucle pendant que tu ajustes les dimensions.
Avec un fichier
POST/api/v1/quotes/file
La méthode courte : tu téléverses la pièce et nous la mesurons. Cela fonctionne pour l’impression 3D et la découpe laser ; le procédé est déduit de l’extension.
Impression 3D — un STL, un 3MF, un STEP :
curl https://haztupieza.es/api/v1/quotes/file \
-H "Authorization: Bearer htp_TU_CLAVE" \
-F "file=@soporte.stl" \
-F 'config={"materialId":"pla","colorId":"negro","qualityId":"standard","infillId":"i25","quantity":4,"supports":true,"leadTimeId":"standard"}'Découpe laser — un SVG ou un DXF. Les dimensions viennent directement du dessin :
curl https://haztupieza.es/api/v1/quotes/file \
-H "Authorization: Bearer htp_TU_CLAVE" \
-F "file=@tapa.svg" \
-F 'config={"sheetId":"pmma-colada-incoloro-3","quantity":10,"leadTimeId":"standard"}'La réponse contient ce que nous avons mesuré, en plus du prix :
{
"ok": true,
"errors": [],
"total": 24.18,
"breakdown": {
"unitPrice": 6.045,
"lines": [
{ "id": "material", "label": "Material", "amount": 4.12 },
{ "id": "machine", "label": "Máquina", "amount": 11.4 },
{ "id": "finishing", "label": "Acabados", "amount": 4.9 }
],
"taxRate": 0.21,
"leadTimeDays": 3
},
"file": {
"name": "soporte.stl",
"mesh": {
"volumeCm3": 18.42,
"surfaceCm2": 96.3,
"boundingBoxMm": { "x": 62.4, "y": 41, "z": 18 },
"triangles": 24680,
"watertight": true,
"hash": "9f2c1a7b"
}
}
}Nous ne conservons rien du fichier. Il est mesuré en mémoire puis supprimé. Si nous ne savons pas ouvrir le format — un SolidWorks, un Illustrator — la réponse est 200 avec «manualReview» à true et le motif : dans ce cas, le devis est fait par une personne.
Avec la géométrie déjà mesurée
POST/api/v1/quotes
Si tu as déjà le volume et la boîte englobante de la pièce — parce que tu les mesures toi-même ou que tu les as conservés d’un devis précédent — tu peux éviter de téléverser le fichier.
curl https://haztupieza.es/api/v1/quotes \
-H "Authorization: Bearer htp_TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"process": "FDM_3D",
"label": "soporte.stl",
"config": {
"materialId": "pla",
"colorId": "negro",
"qualityId": "standard",
"infillId": "i25",
"quantity": 4,
"supports": true,
"leadTimeId": "standard"
},
"mesh": {
"volumeCm3": 18.42,
"surfaceCm2": 96.3,
"boundingBoxMm": {
"x": 62.4,
"y": 41,
"z": 18
},
"triangles": 24680,
"watertight": true,
"hash": "9f2c1a7b"
}
}'Un 200 ne veut pas toujours dire oui. Quand la pièce ne peut pas être fabriquée — cette plaque n’est plus proposée, la dimension ne rentre pas dans la machine — la réponse reste 200 avec «ok» à false et le motif dans «errors». C’est une réponse, pas une erreur : réessayer donnerait exactement le même résultat. Vérifie toujours «ok».
Découpe laser, tous les champs
Sans fichier, tu peux demander n’importe quelle forme du catalogue. Cet exemple contient absolument tout ce que l’endpoint accepte, avec les valeurs par défaut visibles ; presque rien n’est obligatoire.
curl https://haztupieza.es/api/v1/quotes \
-H "Authorization: Bearer htp_TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"process": "LASER_ACRYLIC",
"label": "frontal",
"config": {
"sheetId": "pmma-colada-incoloro-3",
"shape": "ROUNDED_RECT",
"shapeId": "rounded-rect",
"shapeParams": {
"w": 300,
"h": 200,
"radius": 12
},
"widthMm": 300,
"heightMm": 200,
"cornerRadiusMm": 12,
"innerDiameterMm": 0,
"quantity": 10,
"cutouts": [
{
"id": "ventana",
"shapeId": "circle",
"params": {
"d": 22
},
"xMm": 60,
"yMm": 100,
"rotationDeg": 0,
"conservarPieza": true
},
{
"id": "ranura",
"shapeId": "stadium",
"params": {
"w": 40,
"h": 8
},
"xMm": 240,
"yMm": 100,
"rotationDeg": 90
},
{
"id": "rotulo",
"shapeId": "texto",
"params": {},
"texto": {
"texto": "SALIDA",
"tipografiaId": "stardos-stencil",
"alturaMm": 25
},
"xMm": 150,
"yMm": 100,
"rotationDeg": 0
}
],
"holes": {
"pattern": "CORNERS",
"diameterMm": 4,
"edgeDistanceMm": 10,
"count": 4,
"edgeCounts": [
2,
2,
2,
2
],
"rows": 0,
"columns": 0,
"centerDistanceMm": 0,
"points": []
},
"engraveAreaCm2": 0,
"leadTimeId": "express",
"vectorPendingReview": false,
"notes": "Cantos pulidos por la cara vista."
}
}'Seuls ceux-ci sont obligatoires : sheetId, shape, widthMm, heightMm, quantity, leadTimeId
shapeId: "texto" — découpe le texte comme contour de la pièce, avec la police et la hauteur que tu indiques.
curl https://haztupieza.es/api/v1/quotes \
-H "Authorization: Bearer htp_TU_CLAVE" \
-H "Content-Type: application/json" \
-d '{
"process": "LASER_ACRYLIC",
"config": {
"sheetId": "pmma-colada-incoloro-3",
"shape": "CUSTOM",
"shapeId": "texto",
"texto": {
"texto": "ABIERTO",
"tipografiaId": "anton",
"alturaMm": 80
},
"widthMm": 400,
"heightMm": 80,
"quantity": 2,
"leadTimeId": "standard"
}
}'Impression 3D, tous les champs
Idem pour FDM : l’exemple complet, avec les options facultatives incluses.
curl https://haztupieza.es/api/v1/quotes/file \
-H "Authorization: Bearer htp_TU_CLAVE" \
-F "file=@pieza.3mf" \
-F 'config={"materialId":"pla","colorId":"negro","qualityId":"standard","infillId":"i25","quantity":4,"supports":true,"leadTimeId":"standard","finishIds":["sanding"],"extraColorIds":["rojo"],"plateId":"auto","nozzleId":"auto","pauses":[{"layer":40,"action":"Colocar 4 tuercas M3 en los alojamientos","inserts":[{"optionId":"tuerca-m3","quantity":4}]}],"notes":"La cara buena es la de arriba."}'Options
Les identifiants acceptés par «materialId», «sheetId» et les autres. Cette liste vient du même catalogue que celui utilisé par l’atelier et change avec lui : ne la copie pas, demande-la.
Tout ce qui suit, en un seul appel et toujours à jour :
GET/api/v1/catalog
curl https://haztupieza.es/api/v1/catalog \
-H "Authorization: Bearer htp_TU_CLAVE"Et voici son état aujourd’hui :
Matériaux (impression 3D)
| Identifiant | Nom | Détail |
|---|---|---|
| pla | PLA | PLA · 15 colores |
| pla-alta-resistencia | PLA alta resistencia | PLA · 9 colores |
| pla-mate | PLA Mate | PLA · 3 colores |
| pla-reciclado | PLA Reciclado | PLA · 3 colores |
| pla-seda | PLA Silk | PLA · 7 colores |
| pla-madera | PLA Madera | PLA · 3 colores |
| pla-marmol | PLA Marmol | PLA · 2 colores |
| pla-glitter | PLA Glitter | PLA · 4 colores |
| pla-fluorescente | PLA Fluorescente (glow in the dark) | PLA · 2 colores |
| pla-metalizado | PLA Metalizado | PLA · 4 colores |
| petg | PETG | PETG · 7 colores |
| abs | ABS-E | ABS · 5 colores |
| asa | ASA | ASA · 4 colores |
| tpu-95a | TPU 95A Flex | TPU · 5 colores |
| nylon-pa | Nylon PA | PA · 2 colores |
| hips | HIPS | HIPS · 2 colores |
Chaque matériau contient ses couleurs dans «colors». L’id de la couleur va dans «colorId».
Qualités
| Identifiant | Nom | Détail |
|---|---|---|
| draft | Borrador 0,28 mm | 0.28 mm |
| standard | Estándar 0,20 mm | 0.2 mm |
| fine | Fina 0,16 mm | 0.16 mm |
| ultra | Ultrafina 0,12 mm | 0.12 mm |
Remplissages
| Identifiant | Nom | Détail |
|---|---|---|
| i15 | 15 % ligero | 15 % |
| i25 | 25 % estándar | 25 % |
| i40 | 40 % resistente | 40 % |
| i60 | 60 % robusto | 60 % |
| i100 | 100 % macizo | 100 % |
Plaques d’acrylique (découpe laser)
| Identifiant | Nom | Détail |
|---|---|---|
| pmma-colada-incoloro-3 | Metacrilato transparente 3 mm | 3 mm · 1000×600 mm |
| pmma-colada-incoloro-5 | Metacrilato transparente 5 mm | 5 mm · 1000×600 mm |
| pmma-colada-incoloro-6 | Metacrilato transparente 6 mm | 6 mm · 1000×600 mm |
| pmma-colada-incoloro-8 | Metacrilato transparente 8 mm | 8 mm · 1000×600 mm |
| pmma-colada-incoloro-10 | Metacrilato transparente 10 mm | 10 mm · 1000×600 mm |
| pmma-extrusion-incoloro-3 | Metacrilato extrusión transparente 3 mm | 3 mm · 1000×600 mm |
| pmma-extrusion-incoloro-5 | Metacrilato extrusión transparente 5 mm | 5 mm · 1000×600 mm |
| pmma-blanco-3 | Metacrilato opal 3 mm | 3 mm · 1000×600 mm |
| pmma-negro-3 | Metacrilato negro 3 mm | 3 mm · 1000×600 mm |
| pmma-tintado-3-rojo | Metacrilato tintado rojo 3 mm | 3 mm · 1000×600 mm |
| pmma-tintado-3-azul | Metacrilato tintado azul 3 mm | 3 mm · 1000×600 mm |
| pmma-tintado-3-verde | Metacrilato tintado verde 3 mm | 3 mm · 1000×600 mm |
| pmma-tintado-3-ambar | Metacrilato tintado ámbar 3 mm | 3 mm · 1000×600 mm |
| pmma-tintado-3-fume | Metacrilato tintado fumé 3 mm | 3 mm · 1000×600 mm |
| dm-3 | DM 3 mm | 3 mm · 800×400 mm |
| pmma-fluor-3-naranja | Metacrilato fluorescente naranja 3 mm | 3 mm · 1000×600 mm |
| pmma-fluor-3-rojo | Metacrilato fluorescente rojo 3 mm | 3 mm · 1000×600 mm |
| pmma-fluor-3-verde | Metacrilato fluorescente verde 3 mm | 3 mm · 1000×600 mm |
Formes du catalogue
| Identifiant | Nom | shapeParams |
|---|---|---|
| rect | Rectángulo | w, h |
| rect-bevel | Rectángulo achaflanado | w, h, bevel |
| rect-corner | Rectángulo con esquina cortada | w, h, cutW, cutH |
| rect-slant | Rectángulo con lado inclinado | w, hLeft, hRight |
| separador | Separador de estantería | w, h, frente |
| triangle | Triángulo | w, h |
| triangle-right | Triángulo rectángulo | w, h |
| triangle-right-mirror | Triángulo rectángulo invertido | w, h |
| trapezoid | Trapecio | wTop, wBottom, h |
| parallelogram | Paralelogramo | w, h, offset |
| hexagon | Hexágono | w, h |
| octagon | Octágono | w, h, bevel |
| polygon | Polígono regular | sides, d |
| rounded-rect | Rectángulo redondeado | w, h, radius |
| circle | Círculo | d |
| ring | Corona | d, inner |
| oval | Óvalo | w, h |
| stadium | Óvalo plano | w, h |
| semicircle | Semicírculo | d |
| quarter-circle | Cuarto de círculo | r |
| arch | Arco | w, h |
| barrel | Tonel | w, h, bulge |
| star | Estrella | points, d, inner |
| heart | Corazón | w, h |
| drop | Gota | w, h |
| arrow | Flecha | w, h, stem, head |
| kite | Cometa | w, h, cross |
| gem | Gema | w, h, crown, top |
«shapeId» choisit la forme et «shapeParams» lui transmet ses dimensions, qui sont différentes pour chacune. Avec un fichier ou un rectangle sur mesure, aucun des deux n’est nécessaire.
Motifs de perçages
| Identifiant | Nom | Détail |
|---|---|---|
| NONE | Sin agujeros | — |
| CORNERS | En las esquinas | diameterMm, edgeDistanceMm |
| PERIMETER | Repartidos por el borde | diameterMm, edgeDistanceMm, count o edgeCounts |
| RADIAL | En círculo | diameterMm, count, centerDistanceMm |
| GRID | En cuadrícula | diameterMm, rows, columns, centerDistanceMm |
| POINTS | En coordenadas concretas | diameterMm, points[{ xMm, yMm }] |
| CUSTOM | Los que traiga el archivo | — |
Délais
| Identifiant | Nom | Détail |
|---|---|---|
| standard | Estándar | 3 días laborables |
| express | Exprés 48 h | 2 días laborables |
| urgent | Urgente 24 h | 1 días laborables |
Formats de fichier
Formats acceptés et ce que nous faisons avec chacun :
| Identifiant | Proceso | Détail |
|---|---|---|
| .stl .obj .3mf .ply | FDM_3D | Se miden solas. Precio al momento. |
| .step .stp .iges .igs .brep | FDM_3D | Se teselan en el servidor. Precio al momento. |
| .sldprt .ipt .f3d .3dm .sat .x_t | FDM_3D | CAD propietario: lo cotiza una persona. |
| .svg .dxf | LASER_ACRYLIC | Se miden solas. Precio al momento. |
| .ai | LASER_ACRYLIC | Lo cotiza una persona. |
Commandes
GET/api/v1/orders
Les cinquante dernières, de la plus récente à la plus ancienne, avec leur statut et leur suivi.
GET/api/v1/orders/{code}
Une commande précise, avec ses lignes et ses montants.
{
"order": {
"code": "HTP-3MQ8N-LY45L",
"status": "IN_PRODUCTION",
"total": 43.05,
"trackingCarrier": "MRW",
"trackingNumber": "0123456789",
"items": [
{ "label": "tapa.svg", "quantity": 10, "process": "LASER_ACRYLIC",
"unitPrice": 3.55, "total": 35.5 }
]
}
}Les statuts possibles sont : AWAITING_PAYMENT, PAID, IN_PRODUCTION, QUALITY_CHECK, READY_FOR_PICKUP, SHIPPED, DELIVERED, CANCELLED, REFUNDED
Limite de requêtes
60 requêtes par minute et par clé. Chaque réponse indique combien il t’en reste, donc inutile d’atteindre la limite pour savoir où elle se trouve :
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 42Si tu la dépasses, tu reçois un 429 avec «Retry-After» en secondes. Ce n’est pas une sanction : établir un devis construit la géométrie de la pièce et consulte le stock, et une boucle mal fermée peut priver les autres du service.
Quand quelque chose ne va pas
Toujours un JSON avec «code» — stable, pour pouvoir prendre une décision à partir de lui — et «error», qui est le message à lire.
401unauthorized— la clé est absente, incorrecte ou a été révoquée.404not_found— cette commande ne t’appartient pas. Nous répondons pareil si elle n’existe pas : sinon, cela permettrait de découvrir quels codes existent.422invalid_request— la configuration n’est pas valide. Elle est accompagnée de «details», champ par champ.429rate_limited— tu as dépassé la limite.
Pour les assistants et agents
Si tu intègres ceci dans un assistant : avec la clé du client et un fichier, tu peux obtenir un devis en un seul appel, sans étape préalable et sans rien téléverser ailleurs avant.
Une description lisible par machine est disponible dans deux formats :
- /openapi.json — le contrat complet, pour générer un client ou le charger comme outil.
- /llms.txt — un court résumé en texte brut, à mettre dans le contexte.
Ce qui n’est pas encore possible
Finaliser une commande. Obtenir un devis, oui ; acheter, non. Pour cela, il faut d’abord convenir du mode de paiement — sur facture, à crédit — et c’est une conversation, pas un endpoint. Si cela t’intéresse, écris-nous et on en parle : il ne manque presque plus rien.
Il te manque quelque chose ou quelque chose ne répond pas comme indiqué ici ? Dis-le-nous. C’est la personne qui l’a écrit qui te répond.