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" }
Конвертация видео и аудио может занимать несколько минут — слишком долго, чтобы держать открытым один синхронный запрос, поэтому вместо эндпоинта выше здесь используется схема «отправить, затем опрашивать». Отправьте файл, сразу получите job_id в ответ, а затем опрашивайте его статус, пока задача не завершится.
Отправка задачи
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()); } }
Опрос статуса
Опрашивайте этот адрес каждые несколько секунд, передавая полученный job_id. «status» принимает одно из значений: queued, processing, completed или 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_...
Скачивание результата
Когда status становится «completed», в ответе появляется download_url — тот же адрес статуса с добавленным &download=1. Запрос по нему передаёт необработанные байты конвертированного файла с теми же заголовками, что и у остальных эндпоинтов на этой странице. Результат удаляется сразу после скачивания либо автоматически по истечении короткого срока хранения, если его так и не скачали.
scheduleРезультаты задач удаляются сразу после скачивания либо автоматически по истечении короткого срока хранения, если их так и не скачали — скачивайте их не откладывая.
Ошибки
Каждая ошибка возвращает JSON с полем «code», по которому можно ветвить логику в коде, и человекочитаемым «message». Некоторые ошибки содержат дополнительные поля (например, quota_exceeded включает «limit» и «used»).
| Status & code | When it happens |
|---|---|
401 missing_key | Заголовок Authorization не был передан. |
401 invalid_key | Такого ключа не существует или он отозван. |
403 account_suspended | Аккаунт, которому принадлежит этот ключ, заблокирован. |
403 plan_required | Аккаунт на бесплатном тарифе — для доступа к API нужен Basic, Lite, Pro или Team. |
400 invalid_category | «category» не равно «image» или «document». |
400 invalid_target | «target» не является поддерживаемым выходным форматом для этой категории. |
400 no_file | Файл не был передан или загрузка не удалась — поле должно называться «file». |
413 file_too_large | Файл превышает максимальный размер загрузки для вашего тарифа. |
429 quota_exceeded | Месячная квота минут конвертации по тарифу исчерпана. Обновляется в начале следующего календарного месяца. |
429 concurrency_limit | Для этого аккаунта уже выполняется слишком много конвертаций одновременно (общий лимит с сайтом) — дождитесь завершения одной из них и повторите запрос. |
404 job_not_found | Задачи с таким id для этого аккаунта не существует (тот же ответ возвращается и для job_id другого аккаунта — его существование никогда не раскрывается). |
410 result_gone | Задача завершена, но её результат уже удалён (результаты удаляются сразу после скачивания либо автоматически по истечении короткого срока хранения). |
400/415/422/500/503 conversion_failed | Сам файл не удалось конвертировать — причина указана в «message». Код статуса зависит от причины: 400/415/422 означают, что файл или формат назначения не сработают, сколько бы вы ни повторяли попытку; 500/503 означают проблему на стороне сервера, а 503 — тот случай, когда стоит выполнить короткую повторную попытку. |
Supported formats
MP4, MOV, AVI, MKV, WEBM