API y MCP

Envía una imagen PNG o JPEG desde un script, un plugin o un agente de IA y recibe un SVG. La API usa el cálculo en el servidor de Homotope: mismo motor, misma cola, mismos créditos y mismo límite de imagen que el taller.

Descripción completa (OpenAPI 3.1): /api/v1/openapi.json.

El motor es de código abierto (MIT): paquete @homotope/engine en npm, código fuente en GitHub.

Empezar en 3 pasos

  1. Crea una clave en el taller, «Mi cuenta» → «Claves de API». Empieza por hmt_live_ y solo se muestra una vez: guárdala en un gestor de secretos, nunca en un repositorio ni en una URL.
  2. Envía una imagen: POST /api/v1/jobs responde enseguida con 202 y el identificador del cálculo, sin esperar a que termine.
  3. Consulta y luego descarga: pregunta a GET /api/v1/jobs/{id} cada 2 a 5 segundos hasta que el estado sea done y después recupera GET /api/v1/jobs/{id}/svg, o GET /api/v1/jobs/{id}/result?format=pdf (svg, pdf, dxf o eps).

Ejemplos con curl

La clave va en la cabecera Authorization: Bearer …, y solo ahí.

export HOMOTOPE_KEY="hmt_live_…"

# Comprobar la clave
curl -sS https://homotope.example/api/v1/me \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

# Enviar una imagen (opciones opcionales: preajuste, nombre, ajustes)
curl -sS https://homotope.example/api/v1/jobs \
  -H "Authorization: Bearer $HOMOTOPE_KEY" \
  -F [email protected] \
  -F 'options={"preset":"logo","name":"Logo","options":{"export":{"precision":2}}}'
# → 202 {"id":"…","state":"queued","links":{…}}

# Paleta impuesta: trazar con TUS colores (de 2 a 64, distintos), no se inventa ningún otro color
curl -sS https://homotope.example/api/v1/jobs \
  -H "Authorization: Bearer $HOMOTOPE_KEY" \
  -F [email protected] \
  -F 'options={"preset":"logo","palette":["#E30613","#0057B8","#FFFFFF"]}'

# Consultar hasta "state": "done"
curl -sS https://homotope.example/api/v1/jobs/ID \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

# Descargar el SVG
curl -sS -o logo.svg https://homotope.example/api/v1/jobs/ID/svg \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

# El mismo resultado en PDF, EPS o DXF (recorte; tolerance: curvas aplanadas, en px)
curl -sS -OJ "https://homotope.example/api/v1/jobs/ID/result?format=dxf&tolerance=0.05" \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

# Separaciones: una capa por color (SVG por capas, capas DXF; ZIP para PDF y EPS)
curl -sS -OJ "https://homotope.example/api/v1/jobs/ID/result?format=svg&layers=1" \
  -H "Authorization: Bearer $HOMOTOPE_KEY"
# … o un archivo por color, en un ZIP
curl -sS -OJ "https://homotope.example/api/v1/jobs/ID/result?format=pdf&layers=zip" \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

# ¿Listo para el recorte? Comprobar el DXF (herramienta de 0,3 mm, bordes compartidos fusionados)
curl -sS "https://homotope.example/api/v1/jobs/ID/cutcheck?tool_mm=0.3&merge_shared=true" \
  -H "Authorization: Bearer $HOMOTOPE_KEY"
# → {"id":"…","report":{"blocking":0,"check":2,"totals":{…},"issues":[…],…}}

# Últimos cálculos (20 por defecto, 100 como máximo; "nextCursor" para la página siguiente)
curl -sS "https://homotope.example/api/v1/jobs?limit=50" \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

# Cancelar un cálculo en cola, o eliminar un resultado
curl -sS -X DELETE https://homotope.example/api/v1/jobs/ID \
  -H "Authorization: Bearer $HOMOTOPE_KEY"

Preajustes: logo, illustration, pixel-art, line-art, centerline (trazo único: trazados stroke de una sola pasada, para láser, plóter o bordado), photo. Los ajustes aceptados y sus límites son los del panel «Avanzado» del taller, descritos en el documento OpenAPI (JobOptions).

Formatos de resultado

¿Listo para el recorte?

GET /api/v1/jobs/{id}/cutcheck analiza el DXF que produciría …/result?format=dxf (mismos tolerance, include_background, merge_shared), en solo lectura, y devuelve un informe JSON:

Derechos

Límites

Errores

Todo error tiene la forma {"error": {"code": "…", "message": "…"}}, con un mensaje legible en el idioma de la cabecera Accept-Language (inglés por defecto); básate en el code.

Estado Códigos Qué hacer
401 invalid_api_key Clave ausente, desconocida o revocada.
402 payment_required Sin cuota Pro ni créditos restantes: compra un paquete o pásate a Pro.
404 not_found Cálculo desconocido (o de otra cuenta).
408 upload_timeout Envío demasiado largo o demasiado lento: el límite es max(60 s, tamaño anunciado ÷ 256 KB/s) y el caudal debe mantenerse en 32 KB/s como mínimo. Comprueba la conexión y vuelve a intentarlo.
409 not_ready SVG pedido demasiado pronto: consulta hasta done.
410 gone Resultado eliminado (conservación o eliminación).
413 payload_too_large, too_large, quota_exceeded Archivo demasiado pesado, imagen demasiado grande o almacenamiento lleno.
415 unsupported_media_type Ni PNG ni JPEG (firma del archivo, nunca su nombre ni su tipo declarado).
422 stacked_separations, too_complex, unconvertible Un archivo por color pedido sobre un resultado apilado (elige el modo «Recortado»); conversión o comprobación de recorte demasiado larga o pesada (simplifica el trazado); resultado que no se puede convertir. Reintentar tal cual no servirá de nada.
429 rate_limited, too_many_jobs, too_many_uploads Espera el plazo de Retry-After, sin reintentar en bucle.
503 busy, storage_unavailable, unavailable Plazas de conversión ocupadas (busy, con Retry-After) o servicio no disponible temporalmente: vuelve a intentarlo más tarde.

Servidor MCP (agentes de IA)

Homotope expone un servidor MCP (Model Context Protocol), una fachada fina de esta API, sobre el transporte «Streamable HTTP»:

Ejemplo de configuración para un cliente MCP (la clave se queda contigo):

{
  "mcpServers": {
    "homotope": {
      "type": "http",
      "url": "https://homotope.example/mcp",
      "headers": { "Authorization": "Bearer hmt_live_…" }
    }
  }
}

Herramientas ofrecidas al agente:

Un error de herramienta lleva el estado y el código de la API (402, 413, 429…) y un mensaje legible. Una image_url debe ser pública: https, puerto 443, sin dirección privada ni local, 3 redirecciones como máximo, leída en 15 segundos.

Sin OAuth: basta con la clave de API. Sin transporte stdio: el servidor es remoto. El servidor no conserva ninguna sesión entre dos solicitudes.