Saltar al contenido

Precio al instante: sube tu archivo y lo ves antes de registrarte.

API

Manda un archivo y una configuración, y te devolvemos el precio al momento: impresión 3D y corte láser de metacrilato. Es el mismo motor que calcula los precios en la web, así que si tienes tarifas acordadas salen aplicadas.

Empezar

Necesitas una cuenta y una clave. La clave se crea desde Cuenta → Claves de API y se enseña una sola vez: no la guardamos en claro, así que si la pierdes hay que revocarla y crear otra.

Todo va por HTTPS y responde JSON. Las peticiones con cuerpo lo esperan en JSON y con Content-Type: application/json; las que llevan archivo, en multipart.

Para comprobar que la clave funciona, cualquier endpoint sirve:

curl https://haztupieza.es/api/v1/orders \
  -H "Authorization: Bearer htp_TU_CLAVE"

Cotizar

Cotizar es gratis y no crea nada: ni cotización guardada, ni carrito, ni pedido. Se puede llamar en bucle mientras se ajustan medidas.

Con un archivo

POST/api/v1/quotes/file

La forma corta: subes la pieza y la medimos nosotros. Vale para impresión 3D y para corte láser; el proceso se deduce de la extensión.

Impresión 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"}'

Corte láser — un SVG o un DXF. Las medidas salen del propio dibujo:

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 respuesta trae lo que hemos medido, además del precio:

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"
    }
  }
}

Del archivo no guardamos nada. Se mide en memoria y se descarta. Si el formato no lo sabemos abrir —un SolidWorks, un Illustrator— la respuesta es 200 con «manualReview» a true y el motivo: eso lo cotiza una persona.

Con la geometría ya medida

POST/api/v1/quotes

Si ya tienes el volumen y la caja de la pieza —porque la mides tú, o porque las guardaste de una cotización anterior— puedes ahorrarte subir el archivo.

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 no siempre es un sí. Cuando la pieza no se puede fabricar —esa plancha ya no se sirve, la medida no cabe en la máquina— la respuesta sigue siendo 200 con «ok» a false y el motivo en «errors». Es una respuesta, no un fallo: reintentarla daría exactamente lo mismo. Mira siempre «ok».

Corte láser, todos los campos

Sin archivo se puede pedir cualquier forma del catálogo. Este ejemplo lleva absolutamente todo lo que acepta el endpoint, con los valores por defecto puestos a la vista; casi nada es obligatorio.

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."
    }
  }'

Solo son obligatorios estos: sheetId, shape, widthMm, heightMm, quantity, leadTimeId

shapeId: "texto" — corta el texto como contorno de la pieza, con la tipografía y la altura que le digas.

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"
    }
  }'

Impresión 3D, todos los campos

Lo mismo para FDM: el ejemplo largo, con lo opcional incluido.

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."}'

Opciones

Los identificadores que aceptan «materialId», «sheetId» y compañía. Esta lista sale del mismo catálogo que usa el taller y cambia cuando cambia: no la copies, pídela.

Todo lo de abajo, en una sola llamada y siempre al día:

GET/api/v1/catalog

curl https://haztupieza.es/api/v1/catalog \
  -H "Authorization: Bearer htp_TU_CLAVE"

Y así está hoy:

Materiales (impresión 3D)

IdentificadorNombreDetalle
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

Cada material trae sus colores en «colors». El id del color va en «colorId».

Calidades

IdentificadorNombreDetalle
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

Rellenos

IdentificadorNombreDetalle
i1515 % ligero15 %
i2525 % estándar25 %
i4040 % resistente40 %
i6060 % robusto60 %
i100100 % macizo100 %

Planchas de metacrilato (corte láser)

IdentificadorNombreDetalle
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

Formas del catálogo

IdentificadorNombreshapeParams
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» elige la forma y «shapeParams» le pasa sus medidas, que son distintas en cada una. Con un archivo o con un rectángulo a medida no hace falta ninguna de las dos.

Patrones de agujeros

IdentificadorNombreDetalle
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—

Plazos

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

Formatos de archivo

Formatos que aceptamos, y lo que hacemos con cada uno:

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

Pedidos

GET/api/v1/orders

Los cincuenta últimos, del más nuevo al más viejo, con su estado y su seguimiento.

GET/api/v1/orders/{code}

Uno concreto, con sus líneas y sus importes.

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 }
    ]
  }
}

Los estados posibles son: AWAITING_PAYMENT, PAID, IN_PRODUCTION, QUALITY_CHECK, READY_FOR_PICKUP, SHIPPED, DELIVERED, CANCELLED, REFUNDED

Límite de peticiones

60 peticiones por minuto y clave. Cada respuesta lleva cuántas te quedan, así que no hace falta chocarse con el techo para saber dónde está:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 42

Al pasarte, un 429 con «Retry-After» en segundos. No es un castigo: cotizar monta la geometría de la pieza y consulta el almacén, y un bucle mal cerrado deja al resto sin servicio.

Cuando algo va mal

Siempre un JSON con «code» —estable, para poder decidir con él— y «error», que es el mensaje para leer.

  • 401 unauthorized — la clave falta, está mal o se revocó.
  • 404 not_found — ese pedido no es tuyo. Contestamos lo mismo si no existe: lo contrario serviría para averiguar qué códigos hay.
  • 422 invalid_request — la configuración no es válida. Viene con «details» campo por campo.
  • 429 rate_limited — te has pasado del límite.

Para asistentes y agentes

Si estás integrando esto en un asistente: con la clave del cliente y un archivo se cotiza en una sola llamada, sin pasos previos y sin subir nada a ningún sitio antes.

Hay descripción legible por máquina en dos formatos:

  • /openapi.json — el contrato completo, para generar un cliente o cargarlo como herramienta.
  • /llms.txt — un resumen corto en texto plano, para meter en contexto.

Lo que todavía no se puede

Cerrar un pedido. Cotizar sí, comprar no. Para eso hay que acordar antes cómo se paga —contra factura, a crédito— y eso es una conversación, no un endpoint. Si te interesa, escríbenos y lo hablamos: está a un paso de estar hecho.

¿Te falta algo o algo no responde como aquí dice? Dínoslo. Contesta quien la ha escrito.