The API is asynchronous and has three steps: submit a file, poll progress, download the result. No keys or sign-up. Rate limiting applies (20/minute;200/hour;1000/day), size up to 25 MB per file.
1. Submit a file for conversion
POST https://spz.lol/api/convert — multipart/form-data with
file and target (the destination format). Returns a job_id.
curl -X POST https://spz.lol/api/convert \
-F "file=@photo.heic" \
-F "target=jpg"
# -> {"ok": true, "job_id": "a1b2c3..."}
2. Poll progress
GET https://spz.lol/api/progress/{job_id} — status
queued / running / done / error. When done it returns a
download_url.
curl https://spz.lol/api/progress/a1b2c3
# -> {"status":"done","progress":100,
# "download_url":"/api/download/<token>.jpg","size":12345}
3. Download the result
GET https://spz.lol{download_url} — returns the ready file. Files are deleted
automatically after 30 minutes.
Full example (Python)
import time, requests
BASE = "https://spz.lol"
with open("photo.heic", "rb") as f:
r = requests.post(f"{BASE}/api/convert",
files={"file": f}, data={"target": "jpg"})
job = r.json()["job_id"]
while True:
p = requests.get(f"{BASE}/api/progress/{job}").json()
if p["status"] in ("done", "error"):
break
time.sleep(0.5)
if p["status"] == "done":
out = requests.get(BASE + p["download_url"]).content
open("photo.jpg", "wb").write(out)
Reference endpoints
GET /api/formats— catalogue of supported formats and targets.GET /api/limits— current limits (size, rate, file lifetime).
For the list of target formats (target) see the
formats page or /api/formats.