Dos endpoints, un solo trabajo: reducir el marcado SVG o convertir cualquier imagen en un data: URI para insertarla en línea. Ambos se ejecutan en el servidor, así que el resultado es determinista e idéntico en todos los navegadores.

# Optimize an SVG snippet
curl -X POST https://jinero.online/api/v1/svg/optimize \
  -H "Content-Type: application/json" \
  -d '{"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><path d=\"M12 2L2 22h20z\"/></svg>", "preset": "balanced"}'
const r = await fetch("https://jinero.online/api/v1/svg/optimize", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ svg: source, preset: "balanced" }),
});
const { output, savings_percent } = await r.json();

Todos los endpoints son públicos: no se necesita clave. Las operaciones no tienen estado y son ligeras, así que los límites son generosos.

# Anonymous limits (per IP):
#   POST /svg/optimize    30 req/min
#   POST /svg/to-datauri  30 req/min
#   GET  /svg/presets     60 req/min

# Max SVG body: 500,000 chars (~500 KB)

Procesa el marcado SVG con SVGO usando uno de tres preajustes. Elimina metadatos, combina transformaciones y redondea los datos de los trazados: normalmente reduce el tamaño un 30-60 % sin cambios visuales.

POST https://jinero.online/api/v1/svg/optimize
ParámetroTipoDescripción
svg string Marcado SVG (con o sin prólogo XML). Máximo 500.000 caracteres.
preset string safe (limpieza mínima), balanced (predeterminado: la mejor relación entre tamaño y seguridad), aggressive (máxima compresión; puede alterar la representación de los SVG con muchos filtros).
curl -X POST https://jinero.online/api/v1/svg/optimize \
  -H "Content-Type: application/json" \
  -d @- <<JSON
{
  "svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"red\"/></svg>",
  "preset": "aggressive"
}
JSON
const r = await fetch("https://jinero.online/api/v1/svg/optimize", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ svg: source, preset: "aggressive" }),
});
const data = await r.json();
console.log(`-${data.savings_percent}%`);
$res = Http::post("https://jinero.online/api/v1/svg/optimize", [
    "svg" => $svgSource,
    "preset" => "balanced",
]);
$optimized = $res->json("output");
Ejemplo de respuesta
{
  "success": true,
  "preset": "aggressive",
  "output": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"red\"/></svg>",
  "original_size": 132,
  "optimized_size": 70,
  "savings_bytes": 62,
  "savings_percent": 46.97
}

Convierte una imagen en un data: URI listo para usar en background-image de CSS, src de HTML o href de SVG. Acepta texto SVG sin procesar, un archivo subido (svg/png/jpg/gif/webp) o una URL para descargar.

POST https://jinero.online/api/v1/svg/to-datauri
ParámetroTipoDescripción
svg string Texto SVG sin procesar. Incompatible con image/url.
image archivo (multipart) Sube un archivo svg/png/jpg/gif/webp. Máximo 5 MB.
url string URL pública de la imagen que se va a descargar. Máximo 2048 caracteres.
options.encoding string utf8 (predeterminado para SVG, ocupa menos en CSS) o base64 (predeterminado para imágenes rasterizadas).
options.quotes string single o double (predeterminado): afecta al escape de las comillas de los atributos dentro del data URI.
# Option 1: raw SVG text
curl -X POST https://jinero.online/api/v1/svg/to-datauri \
  -H "Content-Type: application/json" \
  -d '{"svg": "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"><circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"red\"/></svg>"}'

# Option 2: file upload
curl -X POST https://jinero.online/api/v1/svg/to-datauri \
  -F "[email protected]"

# Option 3: URL fetch
curl -X POST https://jinero.online/api/v1/svg/to-datauri \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/icon.png"}'
// Inline SVG → CSS data URI
const r = await fetch("https://jinero.online/api/v1/svg/to-datauri", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    svg: svgSource,
    options: { encoding: "utf8", quotes: "double" },
  }),
});
const { data_uri, css } = await r.json();
// data_uri  → use anywhere
// css       → background-image: url("…");
Ejemplo de respuesta
{
  "success": true,
  "data_uri": "data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\"%3E%3Ccircle cx=\"12\" cy=\"12\" r=\"10\" fill=\"red\"/%3E%3C/svg%3E",
  "css": "background-image: url(\"data:image/svg+xml,…\")",
  "mime": "image/svg+xml",
  "encoding": "utf8",
  "input_size": 132,
  "output_size": 187
}

Devuelve los preajustes disponibles con una breve descripción legible: útil para rellenar interfaces de ajustes.

GET https://jinero.online/api/v1/svg/presets
curl https://jinero.online/api/v1/svg/presets
const r = await fetch("https://jinero.online/api/v1/svg/presets");
const { presets } = await r.json();
Ejemplo de respuesta
{
  "presets": [
    { "key": "safe",       "name": "Safe",       "description": "Minimal optimization, preserves most attributes" },
    { "key": "balanced",   "name": "Balanced",   "description": "Good compression with minimal visual changes" },
    { "key": "aggressive", "name": "Aggressive", "description": "Maximum compression, may affect some SVG features" }
  ]
}

Semántica HTTP estándar. Los errores devuelven un JSON con el campo "message".

// 422 — validation (oversized SVG, unknown preset, invalid URL)
{ "message": "The preset field must be one of: safe, balanced, aggressive." }

// 422 — input missing on /to-datauri
{ "message": "Provide one of: svg (text), image (file), or url" }

// 422 — SVGO crashed on malformed markup
{ "message": "Invalid SVG: unexpected end of input" }

// 429 — rate limit exceeded
{ "message": "Too Many Attempts." }

Acerca de la SVG API de jinero.online

API REST gratuita para optimizar SVG y codificarlos como data URI: el mismo motor SVGO que usa todo el mundo, más un endpoint to-datauri unificado que acepta texto, archivos o URL.

SVGO por dentro

El optimizador es SVGO con tres perfiles de preajustes cuidadosamente ajustados: el mismo motor que el popular sitio SVGOMG, disponible como API REST.

Tres entradas, un endpoint

/svg/to-datauri acepta marcado sin procesar, un archivo subido o una URL para descargar: elige lo que mejor encaje con la solicitud que ya tienes.

Resultado listo para CSS

Las respuestas con data URI incluyen un fragmento CSS ya formateado, así que puedes pegar el resultado directamente en una hoja de estilos sin escapar nada.

Sin almacenamiento de archivos

La optimización se hace por completo en memoria. Los archivos subidos se eliminan en cuanto se genera la respuesta: no hay nada que limpiar después.

Preguntas frecuentes

No. La SVG API es pública y tiene un límite de solicitudes por IP: 30 solicitudes/minuto en /optimize y /to-datauri, y 60 en /presets.

"balanced" es la opción predeterminada adecuada: elimina metadatos, reduce la precisión numérica y combina transformaciones, pero nunca altera la representación. Usa "aggressive" solo cuando controles el SVG y hayas comparado visualmente el resultado, ya que puede eliminar primitivas de filtro y fusionar trazados.

Para SVG, utf8 (codificado como URL) ocupa menos y es más cómodo en CSS: por eso es el predeterminado. Para formatos binarios como PNG, JPG o WebP, base64 es la única opción y lo aplicamos automáticamente.

Marcado SVG: 500.000 caracteres (~500 KB). Archivos subidos (campo image): 5 MB. Descargas desde URL: no hay un límite fijo para el archivo remoto, pero cancelamos la descarga si la respuesta supera los 5 MB.

Con los preajustes "safe" y "balanced", sí: el resultado se representa igual en los navegadores modernos. "aggressive" puede descartar primitivas de filtro, fusionar trazados similares y redondear más las coordenadas, lo que puede afectar a la representación de los SVG basados en filtros. Comprueba siempre la vista previa después de cambiar de preajuste.