Vectorize

Convierte imágenes rasterizadas a SVG, EPS, PDF o DXF, con ajustes preestablecidos y control por opción. Sin estado.

Documentación

API de vectorize v0.4.8

Conversión de ráster a vector a través de HTTP. Cada solicitud no tiene estado; no se almacena nada.

Endpoints

MétodoRutaDescripción
POST/api/v1/traceConvierte una imagen. Cuerpo: multipart/form-data con el campo image (y options JSON opcional), o bytes de imagen sin procesar con un tipo de contenido image/*, o JSON {"image": "<base64>", "options": {…}}. Consulta: format=svg|eps|pdf|dxf|json, dpi, unit=px|mm|cm|in|pt, width, más cualquier opción a continuación.
GET/api/v1/optionsAjustes preestablecidos, metadatos de opciones, formatos de salida y input — los formatos de imagen que esta compilación decodifica, con sus tipos de medios y extensiones.
GET/api/v1/usageUso de hoy y cuota restante de la clave que llama.
GET/healthzEstado de actividad, profundidad de cola, trabajadores.
GET/metricsMétricas de Prometheus, protegidas por la misma clave de API.

Autenticación: requerida — esta API necesita una cuenta. Inicia sesión o crea una, crea una clave de API para Vectorize allí, y envíala como X-Api-Key: ak_… (o un token de acceso como Authorization: Bearer). Cada cuenta comienza con una asignación gratuita de trazas; GET /api/v1/usage indica lo que queda, y también lo hacen los encabezados X-Usage-Plan, X-Usage-Used, X-Usage-Limit y X-Usage-Remaining en cada respuesta, con X-Usage-Reset en un plan mensual para el momento en que su contador se reinicia. Un plan agotado responde 402 con upgradeUrl.

Encabezados de respuesta: X-Vectorize-Paths, X-Vectorize-Colors, X-Vectorize-Ms, X-Vectorize-Upscale, X-Vectorize-Downscale. Los errores son JSON {"error": "…"} con 400 (opción incorrecta), 401, 402 (plan agotado), 413 (demasiado grande), 415 (formato no decodificable por esta compilación), 422 (no decodificable), 429, 503 (ocupado).

Formatos de imagen aceptados: PNG, JPEG, WebP, GIF, BMP. Cualquier otra cosa responde 415 nombrando el formato que era — HEIF/HEIC en particular, que es lo que una cámara de iPhone escribe por defecto y para lo cual la API no tiene decodificador. La aplicación web convierte esos porque un navegador los decodifica con el decodificador del propio sistema operativo y entrega píxeles; la API solo tiene lo que está compilado en ella. Convierte a JPEG o PNG primero.

Límites en esta instancia: subidas de hasta 20 MB, respondidas con 413, y trazado de hasta 10 megapíxeles. Una imagen más grande no se rechaza: se reduce a ese límite, se traza allí, y se dibuja a su tamaño completo — una foto de teléfono o un escaneo de 600 ppp no lleva ningún detalle que un trazador pueda usar más allá de ese punto — y X-Vectorize-Downscale indica en cuánto. Un upscale de un ajuste preestablecido que no quepa se reduce de la misma manera, informado en X-Vectorize-Upscale. Solo una imagen más de doce veces el límite se rechaza con 413, antes de que se decodifique.

Ejemplos

curl -X POST 'https://vectorize-api.dudko.dev/api/v1/trace?preset=photo&maxColors=16&format=svg' \
     -H 'X-Api-Key: KEY' -F [email protected] -o photo.svg

curl -X POST 'https://vectorize-api.dudko.dev/api/v1/trace?format=pdf&dpi=300' \
     -H 'X-Api-Key: KEY' -H 'Content-Type: image/png' --data-binary @logo.png -o logo.pdf

curl -X POST 'https://vectorize-api.dudko.dev/api/v1/trace?format=json&preset=poster&text=trace' \
     -H 'X-Api-Key: KEY' -F [email protected] -F 'options={"maxColors":8,"transparentBackground":true}'

Pruébalo

Para un asistente

Un endpoint MCP en https://vectorize-api.dudko.dev/mcp es la puerta de entrada a esta API para un asistente: api_access explica cómo funciona la API, trace_options enumera los ajustes preestablecidos y las opciones, y api_request verifica las opciones y devuelve la solicitud exacta con una credencial de corta duración para la cuenta con sesión iniciada. Ninguna imagen pasa a través de él. Apunta un cliente MCP a esa dirección; encuentra el resto — qué servidor de autorización emite los tokens, y qué alcance pedir — en https://vectorize-api.dudko.dev/.well-known/oauth-protected-resource/mcp. Un token se acepta solo si fue emitido para esta dirección y ninguna otra.

Opciones

Todas opcionales; las opciones no establecidas recurren al ajuste preestablecido. Enumeraciones: preset bw|poster|photo, mode color|binary, layering shared|stacked|cutout, curveMode spline|polygon|pixel, strokeMode fill|centerline, text off|trace|raster; booleanos transparentBackground, adaptiveThreshold, gradients, salientColors; palette es una lista separada por comas de #rrggbb.

OpciónRangoSignificado
superpixels0–32 pxAgrupa píxeles vecinos similares antes de colorear. Suaviza el ruido de fotos y el banding de degradados; demasiado grande difumina pequeños detalles.
smooth0–10Suavizado que preserva bordes de la fuente. Aplana el ruido del sensor y los bloques JPEG mientras mantiene bordes reales.
denoise0–5 pasadasPasadas de filtro de mediana. Elimina motas aisladas y ruido JPEG "mosquito" alrededor de los bordes.
cleanEdges0–4 pasadasElimina halos de un píxel entre áreas dejados por el anti-aliasing. Desactívalo si desaparecen líneas finas.
gapFill0–2 pxTraza cada forma en su propio color para ocultar costuras de un píxel que algunos renderizadores muestran entre vecinos.
upscale1–4 ×Amplía la fuente antes de trazar. Curvas más suaves en imágenes pequeñas con anti-aliasing; más lento en grandes. Se reduce automáticamente cuando la imagen ampliada no cabría en el límite de píxeles, en lugar de rechazar la imagen.
maxColors0–64Número de colores en la paleta. Menos colores = más plano, archivo más pequeño; más = más cercano al original.
filterSpeckle0–128 px²Ignora parches más pequeños que esta cantidad de píxeles (longitud de lado). Más alto = más limpio pero pierde pequeños detalles. En modo blanco y negro, los puntos y signos de puntuación que están en una línea de texto se mantienen incluso cuando son más pequeños.
colorPrecision1–8 bitsBits de color conservados al agrupar sin paleta. Más bajo fusiona colores similares.
layerDifference0–128Distancia mínima de color entre capas al agrupar sin paleta.
cornerThreshold0–180 °Ángulo por encima del cual una curva se convierte en una esquina afilada en lugar de una curva suave.
lengthThreshold3.5–10 pxLongitud mínima de segmento al ajustar splines. Más grande = menos curvas, más largas.
spliceThreshold0–180 °Ángulo por debajo del cual dos segmentos se unen en una sola curva.
pathPrecision0–4 decimalesLugares decimales escritos para coordenadas. Menos = archivo más pequeño, ligeramente menos exacto.
threshold0–255Corte de luminancia para blanco y negro. Más bajo conserva solo píxeles oscuros; más alto conserva más.
paletteMerge0–20 ΔEFusiona colores de paleta más cercanos que este ΔE para que una imagen de 5 colores no obtenga 24 casi duplicados.
strokeWidth0–20 pxAncho fijo para trazos de línea central; "measured" usa el grosor propio de cada trazo.
gradientTolerance1–20Cuánto puede desviarse una serie de bandas de color de una rampa de color recta y aun así convertirse en un solo degradado.

Ajustes preestablecidos

Ajuste preestablecidoOpciones efectivas
bw{"mode":"binary","layering":"stacked","curveMode":"spline","denoise":0,"smooth":0,"upscale":2,"maxColors":0,"cleanEdges":0,"gapFill":0,"transparentBackground":false,"superpixels":0,"adaptiveThreshold":true,"paletteMerge":6,"strokeMode":"fill","strokeWidth":0,"gradients":false,"gradientTolerance":6,"salientColors":false,"text":"off","filterSpeckle":4,"colorPrecision":6,"layerDifference":16,"cornerThreshold":60,"lengthThreshold":4,"spliceThreshold":45,"maxIterations":10,"pathPrecision":2,"threshold":128}
poster{"mode":"color","layering":"shared","curveMode":"spline","denoise":0,"smooth":0,"upscale":1,"maxColors":16,"cleanEdges":1,"gapFill":0.5,"transparentBackground":false,"superpixels":0,"adaptiveThreshold":false,"paletteMerge":6,"strokeMode":"fill","strokeWidth":0,"gradients":true,"gradientTolerance":6,"salientColors":true,"text":"trace","filterSpeckle":4,"colorPrecision":8,"layerDifference":16,"cornerThreshold":60,"lengthThreshold":4,"spliceThreshold":45,"maxIterations":10,"pathPrecision":2,"threshold":128}
photo{"mode":"color","layering":"shared","curveMode":"spline","denoise":1,"smooth":3,"upscale":1,"maxColors":24,"cleanEdges":1,"gapFill":0.5,"transparentBackground":false,"superpixels":8,"adaptiveThreshold":false,"paletteMerge":4,"strokeMode":"fill","strokeWidth":0,"gradients":true,"gradientTolerance":8,"salientColors":true,"text":"off","filterSpeckle":8,"colorPrecision":8,"layerDifference":48,"cornerThreshold":180,"lengthThreshold":4,"spliceThreshold":45,"maxIterations":10,"pathPrecision":2,"threshold":128}