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étodo | Ruta | Descripción |
|---|---|---|
| POST | /api/v1/trace | Convierte 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/options | Ajustes 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/usage | Uso de hoy y cuota restante de la clave que llama. |
| GET | /healthz | Estado de actividad, profundidad de cola, trabajadores. |
| GET | /metrics | Mé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ón | Rango | Significado |
|---|---|---|
superpixels | 0–32 px | Agrupa píxeles vecinos similares antes de colorear. Suaviza el ruido de fotos y el banding de degradados; demasiado grande difumina pequeños detalles. |
smooth | 0–10 | Suavizado que preserva bordes de la fuente. Aplana el ruido del sensor y los bloques JPEG mientras mantiene bordes reales. |
denoise | 0–5 pasadas | Pasadas de filtro de mediana. Elimina motas aisladas y ruido JPEG "mosquito" alrededor de los bordes. |
cleanEdges | 0–4 pasadas | Elimina halos de un píxel entre áreas dejados por el anti-aliasing. Desactívalo si desaparecen líneas finas. |
gapFill | 0–2 px | Traza cada forma en su propio color para ocultar costuras de un píxel que algunos renderizadores muestran entre vecinos. |
upscale | 1–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. |
maxColors | 0–64 | Número de colores en la paleta. Menos colores = más plano, archivo más pequeño; más = más cercano al original. |
filterSpeckle | 0–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. |
colorPrecision | 1–8 bits | Bits de color conservados al agrupar sin paleta. Más bajo fusiona colores similares. |
layerDifference | 0–128 | Distancia mínima de color entre capas al agrupar sin paleta. |
cornerThreshold | 0–180 ° | Ángulo por encima del cual una curva se convierte en una esquina afilada en lugar de una curva suave. |
lengthThreshold | 3.5–10 px | Longitud mínima de segmento al ajustar splines. Más grande = menos curvas, más largas. |
spliceThreshold | 0–180 ° | Ángulo por debajo del cual dos segmentos se unen en una sola curva. |
pathPrecision | 0–4 decimales | Lugares decimales escritos para coordenadas. Menos = archivo más pequeño, ligeramente menos exacto. |
threshold | 0–255 | Corte de luminancia para blanco y negro. Más bajo conserva solo píxeles oscuros; más alto conserva más. |
paletteMerge | 0–20 ΔE | Fusiona colores de paleta más cercanos que este ΔE para que una imagen de 5 colores no obtenga 24 casi duplicados. |
strokeWidth | 0–20 px | Ancho fijo para trazos de línea central; "measured" usa el grosor propio de cada trazo. |
gradientTolerance | 1–20 | Cuá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 preestablecido | Opciones 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} |