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
Endpoints
/api/uploadUpload a file in one request (up to 100 MB)Optional/api/upload/createStart a resumable upload for larger filesOptional/api/upload/completeFinish a resumable upload and verify the fileOptional/api/v1/formatsList supported formats and conversion pairs—/api/v1/convertSubmit a conversion jobAPI Key/api/v1/status/:idCheck conversion job statusAPI Key/api/v1/keysCreate a new API keySession/api/v1/keysList your API keysSession/api/v1/keysRevoke an API keySessionLarge 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