Live · v1

The Convertopia REST API

Drive the full server-side conversion pipeline over HTTP — submit a job, poll for status, and download the result. Authenticate with an API key you generate from your dashboard.

Authentication

Every request to /api/v1 carries an X-API-Key header. Generate keys from your dashboard — they are shown once at creation and stored hashed, so copy the value then. A missing or invalid key returns 401.

curl -H "X-API-Key: cvt_your_key_here" \
  https://convertopia.it.com/api/v1/formats

Rate limits

Pro tier
100calls / day
Max tier
Unlimitedcalls / day

Endpoints

VerbPathAuth
POST/api/uploadOptional
POST/api/upload/createOptional
POST/api/upload/completeOptional
GET/api/v1/formats
POST/api/v1/convertAPI Key
GET/api/v1/status/:idAPI Key
POST/api/v1/keysSession
GET/api/v1/keysSession
DELETE/api/v1/keysSession

Large files

POST /api/upload buffers the whole request, so it is capped at 100 MB. Above that, use the resumable flow — the bytes go straight to storage and never pass through our API, which is what makes multi-gigabyte files possible. It is also the only path that survives a dropped connection.

# 1. Start the upload — returns presigned URLs for the first parts
curl -X POST -H "X-API-Key: cvt_your_key" \
  -H "Content-Type: application/json" \
  -d '{"filename":"input.mp4","sourceFormat":"mp4","targetFormat":"webm",\
       "sizeBytes":4294967296}' \
  ${API_BASE}/api/upload/create
# -> {"key":"uploads/...","uploadId":"...","partSize":67108864,
#     "totalParts":64,"urls":[{"partNumber":1,"url":"https://..."}]}

# 2. PUT each 64 MiB slice to its URL. Keep the ETag from every response.
#    Request more URLs from POST /api/upload/parts as you go.

# 3. Finish. The file is verified here: real type from its magic bytes,
#    true size, and decoded pixel volume for images.
curl -X POST -H "X-API-Key: cvt_your_key" \
  -H "Content-Type: application/json" \
  -d '{"key":"uploads/...","uploadId":"...","sourceFormat":"mp4",\
       "targetFormat":"webm","parts":[{"PartNumber":1,"ETag":"\"abc...\""}]}' \
  ${API_BASE}/api/upload/complete
# -> {"storageKey":"uploads/...","size":4294967296,"detectedFormat":"mp4"}

# Interrupted? GET /api/upload/parts?key=...&uploadId=... lists the parts
# already stored, so you only resend what is missing.

Size limits depend on the conversion, not just your plan: each tool has its own ceiling and the smaller of the two applies. Every conversion page shows the real figure for that pair.

Quick start

# 1. Upload a file
curl -X POST -F "file=@input.mp4" \
  -H "X-API-Key: cvt_your_key" \
  https://convertopia.it.com/api/upload

# 2. Submit conversion
curl -X POST \
  -H "X-API-Key: cvt_your_key" \
  -H "Content-Type: application/json" \
  -d '{"storageKey":"uploads/2026-07-26/<uuid>.mp4","sourceFormat":"mp4",'     '"targetFormat":"webm","sourceFilename":"input.mp4"}' \
  https://convertopia.it.com/api/v1/convert

# 3. Poll for status
curl -H "X-API-Key: cvt_your_key" \
  https://convertopia.it.com/api/v1/status/{jobId}

# 4. Download when complete
curl -O -H "X-API-Key: cvt_your_key" \
  https://convertopia.it.com/api/download/{jobId}

Ready to build? Generate a key and make your first call.

Get an API key