Video Conversion API
Convert video between MP4, MOV, AVI, MKV, and WEBM. Video encodes can take minutes, so this is an async, submit-then-poll endpoint rather than one blocking request — same ffmpeg engine behind TransConvert's website converter.
curl -X POST \ .../api/v1/convert-async.php \ -H "Authorization: Bearer ..." \ -F "category=video" \ -F "target=MP4" \ -F "file=@clip.mov" # { "job_id": "job_...", "status": "queued" }
Las conversiones de vídeo y audio pueden tardar minutos, demasiado tiempo para mantener abierta una única solicitud síncrona — estas usan un flujo de envío y consulta en lugar del endpoint anterior. Envía un archivo, recibe enseguida un job_id y luego consulta su estado hasta que termine.
Enviar un trabajo
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Required. "Bearer tc_live_...". |
category | Set to "video". |
target | Required. Output format code: "MP4", "MOV", "AVI", "MKV", or "WEBM". |
file | Required. The video file. |
curl -X POST \ https://transconvert.com/api/v1/convert-async.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=video" \ -F "target=MP4" \ -F "file=@clip.mov" \ -o output.mp4
<?php $ch = curl_init('https://transconvert.com/api/v1/convert-async.php'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer tc_live_your_key_here'], CURLOPT_POSTFIELDS => [ 'category' => 'video', 'target' => 'MP4', 'file' => new CURLFile('clip.mov'), ], ]); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status === 200) { file_put_contents('output.mp4', $response); } else { $error = json_decode($response, true); echo $error['error']['message']; }
const form = new FormData(); form.append('category', 'video'); form.append('target', 'MP4'); form.append('file', new Blob([fs.readFileSync('clip.mov')]), 'clip.mov'); const res = await fetch('https://transconvert.com/api/v1/convert-async.php', { method: 'POST', headers: { Authorization: 'Bearer tc_live_your_key_here' }, body: form, }); if (res.ok) { fs.writeFileSync('output.mp4', Buffer.from(await res.arrayBuffer())); } else { const { error } = await res.json(); console.error(error.message); }
import requests with open('clip.mov', 'rb') as f: response = requests.post( 'https://transconvert.com/api/v1/convert-async.php', headers={'Authorization': 'Bearer tc_live_your_key_here'}, data={'category': 'video', 'target': 'MP4'}, files={'file': f}, ) if response.status_code == 200: with open('output.mp4', 'wb') as out: out.write(response.content) else: print(response.json()['error']['message'])
# gem install multipart-post require 'net/http' require 'net/http/post/multipart' url = URI('https://transconvert.com/api/v1/convert-async.php') File.open('clip.mov') do |file| req = Net::HTTP::Post::Multipart.new url, 'category' => 'video', 'target' => 'MP4', 'file' => UploadIO.new(file, 'application/octet-stream', 'clip.mov') req['Authorization'] = 'Bearer tc_live_your_key_here' res = Net::HTTP.start(url.host, url.port, use_ssl: true) do |http| http.request(req) end if res.code == '200' File.write('output.mp4', res.body) else puts JSON.parse(res.body)['error']['message'] end end
// Gradle: implementation("com.squareup.okhttp3:okhttp:4.+") OkHttpClient client = new OkHttpClient(); RequestBody body = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("category", "video") .addFormDataPart("target", "MP4") .addFormDataPart("file", "clip.mov", RequestBody.create(new File("clip.mov"), MediaType.parse("application/octet-stream"))) .build(); Request request = new Request.Builder() .url("https://transconvert.com/api/v1/convert-async.php") .header("Authorization", "Bearer tc_live_your_key_here") .post(body) .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful()) { Files.write(Paths.get("output.mp4"), response.body().bytes()); } else { System.err.println(response.body().string()); } }
Consultar el estado
Consulta esto cada pocos segundos con el job_id que recibiste. «status» es uno de queued, processing, completed o failed.
https://transconvert.com/api/v1/job-status.php?job_id=job_...
curl -H "Authorization: Bearer tc_live_your_key_here" \ https://transconvert.com/api/v1/job-status.php?job_id=job_...
Descargar el resultado
Cuando el estado sea «completed», la respuesta incluye una download_url — la misma URL de estado con &download=1 añadido. Solicitarla transmite entonces los bytes en bruto del archivo convertido, con las mismas cabeceras que cualquier otro endpoint de esta página. El resultado se elimina en el momento en que se descarga, o automáticamente tras un breve período de conservación si nunca se descarga.
scheduleLos resultados de los trabajos se eliminan inmediatamente después de la descarga, o automáticamente tras un breve período de conservación si nunca se descargan — descárgalos cuanto antes.
Errores
Cada error devuelve un JSON con un "code" sobre el que tu código puede ramificarse, además de un "message" legible por humanos. Algunos errores incluyen campos adicionales (quota_exceeded incluye, por ejemplo, "limit" y "used").
| Status & code | When it happens |
|---|---|
401 missing_key | No se envió ninguna cabecera Authorization. |
401 invalid_key | La clave no existe, o ha sido revocada. |
403 account_suspended | La cuenta propietaria de esta clave está suspendida. |
403 plan_required | La cuenta está en el plan Free: el acceso a la API requiere Basic, Lite, Pro o Team. |
400 invalid_category | "category" no era "image" ni "document". |
400 invalid_target | «target» no es un formato de salida compatible para esa categoría. |
400 no_file | No se envió ningún archivo, o la subida falló; el campo debe llamarse "file". |
413 file_too_large | El archivo supera el tamaño máximo de subida permitido por tu plan. |
429 quota_exceeded | Se agotó la asignación mensual de minutos de conversión del plan. Se restablece al inicio del siguiente mes natural. |
429 concurrency_limit | Ya hay demasiadas conversiones en curso a la vez para esta cuenta (se comparte con el sitio web); espera a que termine una y vuelve a intentarlo. |
404 job_not_found | No existe ningún trabajo con ese id para esta cuenta (también se devuelve para el job_id de otra cuenta — su existencia nunca se revela). |
410 result_gone | El trabajo se completó, pero su resultado ya se ha eliminado (los resultados se eliminan inmediatamente después de la descarga, o automáticamente tras un breve período de conservación). |
400/415/422/500/503 conversion_failed | El propio archivo no se pudo convertir; "message" explica el motivo. El código de estado varía según la causa: 400/415/422 significan que el archivo o el destino no funcionarán por más intentos que hagas; 500/503 indican un problema del lado del servidor, y en concreto 503 merece un breve reintento. |
Supported formats
MP4, MOV, AVI, MKV, WEBM