API keys
Create a key while logged in. Send it as X-API-Key: cvk_… or Authorization: Bearer cvk_…. Keys use the same minutes and file limits as your Free / Basic / Pro plan.
Auth & minutes
- API key — preferred for scripts (header above).
- JWT — same as the web app after login.
- Guest — no key; free daily minutes by IP (same as the site).
- Only successful conversion jobs deduct minutes.
- Time zone and unit endpoints are utilities and do not use minutes.
Job flow
POSTa convert endpoint with multipartfile(and target params) →{ job_id }- Poll
GET /api/v1/status/{job_id}untilCOMPLETED/SUCCESSor failure. GET /api/v1/download/{job_id}for the binary result.
Discover targets with GET /api/v1/formats.
Endpoints
| Method | Path | Auth | Notes |
|---|---|---|---|
| GET | /api/v1/formats | none | Supported formats & utilities |
| GET | /api/v1/plans | none | Pricing / plan limits |
| GET | /api/v1/openapi.json | none | OpenAPI 3 sketch |
| POST | /api/v1/convert | key|jwt|guest | Image convert |
| POST | /api/v1/video-convert | key|jwt|guest | Video convert / compress / GIF / presets |
| POST | /api/v1/audio-convert | key|jwt|guest | Audio convert / extract |
| POST | /api/v1/document-convert | key|jwt|guest | Office / PDF |
| POST | /api/v1/ebook-convert | key|jwt|guest | Ebook (Calibre) |
| POST | /api/v1/archive-convert | key|jwt|guest | Archive extract/create |
| POST | /api/v1/vector-convert | key|jwt|guest | Vector convert |
| POST | /api/v1/compress | key|jwt|guest | Image compress |
| POST | /api/v1/pdf-compress | key|jwt|guest | PDF compress |
| POST | /api/v1/pdf-tool | key|jwt|guest | merge/split/rotate/unlock/protect/… |
| GET | /api/v1/status/{job_id} | key|jwt|guest | Poll job |
| GET | /api/v1/download/{job_id} | key|jwt|guest | Download result |
| POST | /api/v1/time-convert | none | Timezone utility (no minutes) |
| GET | /api/v1/timezones | none | Timezone list |
| POST | /api/v1/unit-convert | none | Unit utility (no minutes) |
| GET | /api/v1/units | none | Unit list |
| POST | /api/v1/auth/api-key | jwt | Create / rotate API key |
| DELETE | /api/v1/auth/api-key | jwt | Revoke API key |
curl sample
# 1) Create an API key (logged-in JWT from the site) curl -sS -X POST https://www.convertica.app/api/v1/auth/api-key \ -H "Authorization: Bearer YOUR_JWT" # 2) Convert an image (uses your plan minutes) curl -sS -X POST https://www.convertica.app/api/v1/convert \ -H "X-API-Key: cvk_YOUR_KEY" \ -F "[email protected]" \ -F "target=jpeg" # Response: {"job_id":"..."} # 3) Poll status curl -sS https://www.convertica.app/api/v1/status/JOB_ID \ -H "X-API-Key: cvk_YOUR_KEY" # 4) Download when status is COMPLETED / SUCCESS curl -sS -o out.jpg https://www.convertica.app/api/v1/download/JOB_ID \ -H "X-API-Key: cvk_YOUR_KEY"
Python sample
import requests
BASE = "https://www.convertica.app"
API_KEY = "cvk_YOUR_KEY"
headers = {"X-API-Key": API_KEY}
with open("photo.png", "rb") as f:
r = requests.post(
f"{BASE}/api/v1/convert",
headers=headers,
files={"file": f},
data={"target": "jpeg"},
timeout=120,
)
r.raise_for_status()
job_id = r.json()["job_id"]
while True:
s = requests.get(f"{BASE}/api/v1/status/{job_id}", headers=headers, timeout=60)
s.raise_for_status()
data = s.json()
status = data.get("status") or data.get("state")
if status in ("COMPLETED", "SUCCESS", "FAILED", "FAILURE"):
break
if status in ("COMPLETED", "SUCCESS"):
out = requests.get(f"{BASE}/api/v1/download/{job_id}", headers=headers, timeout=120)
out.raise_for_status()
open("out.jpg", "wb").write(out.content)
print("saved out.jpg")
else:
print("failed", data)