Aller au contenu

Prix instantané : importe ton fichier et consulte-le avant même de créer un compte.

HazTuPieza

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 :

200 OK
{
  "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)

IdentifiantNomDétail
plaPLAPLA · 15 colores
pla-alta-resistenciaPLA alta resistenciaPLA · 9 colores
pla-matePLA MatePLA · 3 colores
pla-recicladoPLA RecicladoPLA · 3 colores
pla-sedaPLA SilkPLA · 7 colores
pla-maderaPLA MaderaPLA · 3 colores
pla-marmolPLA MarmolPLA · 2 colores
pla-glitterPLA GlitterPLA · 4 colores
pla-fluorescentePLA Fluorescente (glow in the dark)PLA · 2 colores
pla-metalizadoPLA MetalizadoPLA · 4 colores
petgPETGPETG · 7 colores
absABS-EABS · 5 colores
asaASAASA · 4 colores
tpu-95aTPU 95A FlexTPU · 5 colores
nylon-paNylon PAPA · 2 colores
hipsHIPSHIPS · 2 colores

Chaque matériau contient ses couleurs dans «colors». L’id de la couleur va dans «colorId».

Qualités

IdentifiantNomDétail
draftBorrador 0,28 mm0.28 mm
standardEstándar 0,20 mm0.2 mm
fineFina 0,16 mm0.16 mm
ultraUltrafina 0,12 mm0.12 mm

Remplissages

IdentifiantNomDétail
i1515 % ligero15 %
i2525 % estándar25 %
i4040 % resistente40 %
i6060 % robusto60 %
i100100 % macizo100 %

Plaques d’acrylique (découpe laser)

IdentifiantNomDétail
pmma-colada-incoloro-3Metacrilato transparente 3 mm3 mm · 1000×600 mm
pmma-colada-incoloro-5Metacrilato transparente 5 mm5 mm · 1000×600 mm
pmma-colada-incoloro-6Metacrilato transparente 6 mm6 mm · 1000×600 mm
pmma-colada-incoloro-8Metacrilato transparente 8 mm8 mm · 1000×600 mm
pmma-colada-incoloro-10Metacrilato transparente 10 mm10 mm · 1000×600 mm
pmma-extrusion-incoloro-3Metacrilato extrusión transparente 3 mm3 mm · 1000×600 mm
pmma-extrusion-incoloro-5Metacrilato extrusión transparente 5 mm5 mm · 1000×600 mm
pmma-blanco-3Metacrilato opal 3 mm3 mm · 1000×600 mm
pmma-negro-3Metacrilato negro 3 mm3 mm · 1000×600 mm
pmma-tintado-3-rojoMetacrilato tintado rojo 3 mm3 mm · 1000×600 mm
pmma-tintado-3-azulMetacrilato tintado azul 3 mm3 mm · 1000×600 mm
pmma-tintado-3-verdeMetacrilato tintado verde 3 mm3 mm · 1000×600 mm
pmma-tintado-3-ambarMetacrilato tintado ámbar 3 mm3 mm · 1000×600 mm
pmma-tintado-3-fumeMetacrilato tintado fumé 3 mm3 mm · 1000×600 mm
dm-3DM 3 mm3 mm · 800×400 mm
pmma-fluor-3-naranjaMetacrilato fluorescente naranja 3 mm3 mm · 1000×600 mm
pmma-fluor-3-rojoMetacrilato fluorescente rojo 3 mm3 mm · 1000×600 mm
pmma-fluor-3-verdeMetacrilato fluorescente verde 3 mm3 mm · 1000×600 mm

Formes du catalogue

IdentifiantNomshapeParams
rectRectángulow, h
rect-bevelRectángulo achaflanadow, h, bevel
rect-cornerRectángulo con esquina cortadaw, h, cutW, cutH
rect-slantRectángulo con lado inclinadow, hLeft, hRight
separadorSeparador de estanteríaw, h, frente
triangleTriángulow, h
triangle-rightTriángulo rectángulow, h
triangle-right-mirrorTriángulo rectángulo invertidow, h
trapezoidTrapeciowTop, wBottom, h
parallelogramParalelogramow, h, offset
hexagonHexágonow, h
octagonOctágonow, h, bevel
polygonPolígono regularsides, d
rounded-rectRectángulo redondeadow, h, radius
circleCírculod
ringCoronad, inner
ovalÓvalow, h
stadiumÓvalo planow, h
semicircleSemicírculod
quarter-circleCuarto de círculor
archArcow, h
barrelTonelw, h, bulge
starEstrellapoints, d, inner
heartCorazónw, h
dropGotaw, h
arrowFlechaw, h, stem, head
kiteCometaw, h, cross
gemGemaw, 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

IdentifiantNomDétail
NONESin agujeros—
CORNERSEn las esquinasdiameterMm, edgeDistanceMm
PERIMETERRepartidos por el bordediameterMm, edgeDistanceMm, count o edgeCounts
RADIALEn círculodiameterMm, count, centerDistanceMm
GRIDEn cuadrículadiameterMm, rows, columns, centerDistanceMm
POINTSEn coordenadas concretasdiameterMm, points[{ xMm, yMm }]
CUSTOMLos que traiga el archivo—

Délais

IdentifiantNomDétail
standardEstándar3 días laborables
expressExprés 48 h2 días laborables
urgentUrgente 24 h1 días laborables

Formats de fichier

Formats acceptés et ce que nous faisons avec chacun :

IdentifiantProcesoDétail
.stl .obj .3mf .plyFDM_3DSe miden solas. Precio al momento.
.step .stp .iges .igs .brepFDM_3DSe teselan en el servidor. Precio al momento.
.sldprt .ipt .f3d .3dm .sat .x_tFDM_3DCAD propietario: lo cotiza una persona.
.svg .dxfLASER_ACRYLICSe miden solas. Precio al momento.
.aiLASER_ACRYLICLo 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.

200 OK
{
  "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: 42

Si 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.

  • 401 unauthorized — la clé est absente, incorrecte ou a été révoquée.
  • 404 not_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.
  • 422 invalid_request — la configuration n’est pas valide. Elle est accompagnée de «details», champ par champ.
  • 429 rate_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.