Dois endpoints, uma tarefa: reduzir código SVG ou transformar qualquer imagem em um URI data: para incorporar inline. Os dois rodam no servidor, então o resultado é determinístico e idêntico em todos os 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 os endpoints são públicos — sem chave. As operações não guardam estado e são leves, então os limites são 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)

Passa o código SVG pelo SVGO com uma de três predefinições. Remove metadados, simplifica transformações e arredonda os dados dos paths — geralmente 30–60% menor, sem mudanças visuais.

POST https://jinero.online/api/v1/svg/optimize
ParâmetroTipoDescrição
svg string Código SVG (com ou sem o prólogo XML). Até 500.000 caracteres.
preset string safe (limpeza mínima), balanced (padrão — melhor relação entre tamanho e segurança), aggressive (compressão máxima, pode alterar a renderização de SVGs com muitos 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");
Exemplo de resposta
{
  "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
}

Transforma uma imagem em um URI data: pronto para usar em CSS background-image, HTML src ou SVG href. Aceita texto SVG puro, um arquivo enviado (svg/png/jpg/gif/webp) ou uma URL para baixar.

POST https://jinero.online/api/v1/svg/to-datauri
ParâmetroTipoDescrição
svg string Texto SVG puro. Não pode ser usado junto com image/url.
image arquivo (multipart) Envie um arquivo svg/png/jpg/gif/webp. Até 5 MB.
url string URL pública da imagem a baixar. Até 2048 caracteres.
options.encoding string utf8 (padrão para SVG, menor no CSS) ou base64 (padrão para imagens rasterizadas).
options.quotes string single ou double (padrão) — afeta o escape das aspas dos atributos dentro do 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("…");
Exemplo de resposta
{
  "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
}

Retorna as predefinições disponíveis com uma descrição curta e legível — útil para preencher interfaces de configuração.

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();
Exemplo de resposta
{
  "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 padrão. Os erros retornam JSON com o 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." }

Sobre a SVG API do jinero.online

API REST gratuita para otimizar SVG e codificar em data URI — o mesmo motor SVGO que todo mundo usa, além de um endpoint to-datauri unificado que aceita texto, arquivos ou URLs.

SVGO por baixo

O otimizador é o SVGO com três perfis de predefinição cuidadosamente ajustados — o mesmo motor do popular SVGOMG, disponível como API REST.

Três entradas, um endpoint

/svg/to-datauri aceita código puro, um arquivo enviado ou uma URL para baixar — escolha o que combinar com a requisição que você já tem.

Resultado pronto para CSS

As respostas com data URI incluem um trecho de CSS já formatado, para você colocar o resultado direto em uma folha de estilos sem escape.

Sem armazenamento de arquivos

A otimização acontece toda em memória. Os arquivos enviados são excluídos assim que a resposta é gerada — não sobra nada para limpar depois.

Perguntas frequentes

Não. A SVG API é pública e tem limite de uso por IP — 30 requisições/minuto em /optimize e /to-datauri, 60 em /presets.

"balanced" é o padrão certo — remove metadados, reduz a precisão numérica e simplifica transformações, mas nunca altera a renderização. Use "aggressive" só quando você controla o SVG e já comparou o resultado visualmente, porque ele pode remover primitivas de filtro e mesclar paths.

Para SVGs, o utf8 (com URL encoding) é menor e funciona bem no CSS — por isso é o padrão. Para formatos binários como PNG, JPG ou WebP, base64 é a única opção, e nós o aplicamos automaticamente.

Código SVG: 500.000 caracteres (~500 KB). Envio de arquivos (campo image): 5 MB. Download por URL: não há limite fixo para o arquivo remoto, mas interrompemos se a resposta passar de 5 MB.

Com as predefinições "safe" e "balanced", sim — o resultado é renderizado de forma idêntica nos navegadores modernos. "aggressive" pode descartar primitivas de filtro, mesclar paths parecidos e arredondar mais as coordenadas, o que pode afetar a renderização de SVGs baseados em filtros. Sempre confira o resultado depois de trocar de predefinição.