SVG Optimization via API: Why It Makes Sense

·5 min read

Running SVGO locally is a reasonable choice for Node.js projects. But it comes with hidden costs that add up: installation, version pinning, configuration maintenance, and occasional breaking changes between major SVGO releases. A hosted API trades those costs for a simple HTTP request.

The hidden cost of local SVGO

Version management

SVGO has had three major versions with breaking plugin API changes. SVGO 1.x, 2.x, and 3.x all have different config formats. If you’re pinned to 2.x and the ecosystem moves to 3.x, you’re stuck or you need a migration. If you upgrade without testing, your icon output may change.

Node.js requirement

Every environment where you want to optimize SVGs needs Node.js installed. CI runners, Docker images, Python services, Ruby on Rails apps — all need Node.js just to call SVGO. That’s a non-trivial dependency for non-JavaScript stacks.

Configuration drift

Teams often create a svgo.config.js once and forget it. Months later, the config has edge cases for specific SVGs, nobody remembers why certain plugins are disabled, and the config diverges between projects. A hosted API uses one well-maintained default config for everyone.

What a hosted SVG optimization API looks like

The svg.dog API reduces SVG optimization to one HTTP request:

# Any language, any environment
curl -X POST https://api.svg.dog/v1/optimize \
  -H "Authorization: Bearer YOUR_KEY" \
  -F "file=@icon.svg" \
  -o icon.min.svg

Python:

import httpx

with open('icon.svg', 'rb') as f:
    resp = httpx.post(
        'https://api.svg.dog/v1/optimize',
        headers={'Authorization': f'Bearer {API_KEY}'},
        files={'file': ('icon.svg', f, 'image/svg+xml')},
    )

with open('icon.min.svg', 'wb') as f:
    f.write(resp.content)

print(f"Saved: {resp.headers['x-savings-percent']}%")

Ruby:

require 'net/http'

uri = URI('https://api.svg.dog/v1/optimize')
req = Net::HTTP::Post.new(uri)
req['Authorization'] = "Bearer #{ENV['SVGDOG_API_KEY']}"
# ... multipart form with file

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
  http.request(req)
end

File.write('icon.min.svg', response.body)

Always up to date

When SVGO releases a new version with better optimization, a hosted API can update without any action from you. Your builds get the improvement automatically. With local SVGO, you need to manually update, test, and deploy — and every project does this independently.

Batch endpoint

For bulk optimization, the /v1/optimize/batch endpoint accepts up to 50 files in a single request and returns a ZIP archive:

curl -X POST https://api.svg.dog/v1/optimize/batch \
  -H "Authorization: Bearer YOUR_KEY" \
  -F "files=@icon1.svg" \
  -F "files=@icon2.svg" \
  -F "files=@icon3.svg" \
  -o optimized.zip

This is useful for one-time migrations (optimizing an entire icon library) and for CI jobs that process a batch of changed files.

URL optimization

The API also accepts a URL instead of a file upload, useful for optimizing SVGs hosted on remote servers:

curl -X POST https://api.svg.dog/v1/optimize/url \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/icon.svg"}' \
  -o icon.min.svg

Trade-offs: API vs local

FactorLocal SVGOsvg.dog API
Offline buildsYesNo
Always latest SVGOManual updateAutomatic
Works in non-Node.jsNoYes
Setup timeMinutesSeconds
MaintenanceYousvg.dog
Rate limitsNone500/month free

Who should use the API

The API makes the most sense for:

  • Non-Node.js projects (Python, Ruby, Go, PHP, etc.)
  • Teams that want zero SVGO maintenance overhead
  • CI/CD pipelines where simplicity matters more than offline capability
  • One-time bulk migration of large icon libraries

See the full API documentation and the Node.js SDK guide at optimize SVG in Node.js.

Optimize SVGs instantly — no setup needed

500 free optimizations per month. No credit card required.

Get a free API key →