Два ендпоінти, одна задача: зменшити SVG-розмітку або загорнути будь-яке зображення в data: URI для вбудовування. Обидва працюють на сервері, тож результат детермінований і однаковий у всіх браузерах.

# 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();

Усі ендпоінти публічні — ключ не потрібен. Операції без стану й легкі, тож ліміти щедрі.

# 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)

Пропускає SVG-розмітку через SVGO з одним із трьох пресетів. Видаляє метадані, згортає трансформації, округлює дані контурів — зазвичай на 30–60% менше без візуальних змін.

POST https://jinero.online/api/v1/svg/optimize
ПараметрТипОпис
svg string SVG-розмітка (з XML-прологом чи без). До 500 000 символів.
preset string safe (мінімальне очищення), balanced (за замовчуванням — найкраще співвідношення розміру й безпеки), aggressive (максимальне стиснення, може змінити рендеринг SVG з великою кількістю фільтрів).
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");
Приклад відповіді
{
  "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
}

Загортає зображення в data: URI, готовий для CSS background-image, HTML src чи SVG href. Приймає сирий SVG-текст, завантажений файл (svg/png/jpg/gif/webp) або URL, який треба завантажити.

POST https://jinero.online/api/v1/svg/to-datauri
ПараметрТипОпис
svg string Сирий SVG-текст. Не можна поєднувати з image/url.
image файл (multipart) Завантажте файл svg/png/jpg/gif/webp. До 5 МБ.
url string Публічний URL зображення для завантаження. До 2048 символів.
options.encoding string utf8 (за замовчуванням для SVG, менше в CSS) або base64 (за замовчуванням для растру).
options.quotes string single або double (за замовчуванням) — впливає на екранування лапок атрибутів усередині 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("…");
Приклад відповіді
{
  "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
}

Повертає доступні пресети з коротким зрозумілим описом — зручно для заповнення інтерфейсів налаштувань.

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();
Приклад відповіді
{
  "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" }
  ]
}

Стандартна семантика HTTP. Помилки повертають JSON із полем "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." }

Про SVG API jinero.online

Безкоштовний REST API для оптимізації SVG і кодування в data URI — той самий рушій SVGO, що й у всіх, а також єдиний ендпоінт to-datauri, який приймає текст, файли чи URL.

SVGO під капотом

Оптимізатор — це SVGO з трьома ретельно налаштованими пресетами: той самий рушій, що й у популярного SVGOMG, доступний як REST API.

Три способи передати, один ендпоінт

/svg/to-datauri приймає сиру розмітку, завантажений файл або URL — обирайте те, що пасує до вашого запиту.

Результат, готовий для CSS

Відповіді з data URI містять готовий CSS-фрагмент, тож результат можна вставити просто в таблицю стилів без екранування.

Без зберігання файлів

Оптимізація повністю в пам'яті. Завантажені файли видаляються одразу після формування відповіді — нічого не треба прибирати.

Часті запитання

Ні. SVG API публічний, з лімітом запитів на IP — 30 запитів/хв на /optimize і /to-datauri, 60 — на /presets.

"balanced" — правильний вибір за замовчуванням: він видаляє метадані, зменшує точність чисел і згортає трансформації, але ніколи не змінює рендеринг. "aggressive" використовуйте, лише коли контролюєте SVG і візуально порівняли результат, бо він може видаляти примітиви фільтрів і об'єднувати контури.

Для SVG utf8 (з URL-кодуванням) менший і зручний для CSS — тому він за замовчуванням. Для бінарних форматів на кшталт PNG, JPG чи WebP base64 — єдиний варіант, і ми застосовуємо його автоматично.

SVG-розмітка: 500 000 символів (~500 КБ). Завантаження файлів (поле image): 5 МБ. Завантаження за URL: жорсткого обмеження на віддалений файл немає, але ми перериваємо завантаження, якщо відповідь перевищує 5 МБ.

З пресетами "safe" і "balanced" — так: результат рендериться однаково в сучасних браузерах. "aggressive" може відкидати примітиви фільтрів, об'єднувати схожі контури й сильніше округлювати координати, що може вплинути на рендеринг SVG, побудованих на фільтрах. Після зміни пресета завжди перевіряйте результат.