TransConvert API
Конвертируйте изображения и документы программно через один простой HTTP-эндпоинт.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Быстрый старт
От нуля до первого конвертированного файла за три шага.
Зарегистрируйтесь (или перейдите на платный тариф в существующем аккаунте) на Basic, Lite, Pro или Team, затем создайте ключ на странице аккаунта — вы всегда сможете вернуться и посмотреть его снова.
Отправьте файл методом POST на указанный ниже эндпоинт как multipart/form-data, с ключом в заголовке Authorization и заданными category и target.
Ответ 200 — это необработанные байты конвертированного файла; сохраните тело ответа как есть. Любой другой ответ — это JSON-ошибка с объяснением, что пошло не так.
Аутентификация
Каждый запрос требует API-ключ, который передаётся как Bearer-токен в заголовке Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Доступно на тарифах Basic, Lite, Pro и Team. Создать ключ в личном кабинете →
Проверьте ключ
Быстрый способ убедиться, что ключ работает, ещё до написания реального кода интеграции — сам по себе этот запрос ничего не конвертирует (файл не прикреплён), но ответ 400 no_file вместо 401 подтверждает, что ключ действителен.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
Эндпоинт
Один эндпоинт обрабатывает все виды конвертации. Отправьте POST-запрос multipart/form-data с файлом и указанными ниже полями.
https://transconvert.com/api/v1/convert.php
Параметры
| Field | Description |
|---|---|
Authorization | Обязательно. «Bearer tc_live_...». |
category | Обязательно. «image» или «document» — для сжатия вместо конвертации см. раздел «Сжатие» ниже. |
target | Обязательно. Код выходного формата, например «PNG», «DOCX» — см. раздел «Поддерживаемые форматы» ниже. |
file | Обязательно. Файл для конвертации (multipart-загрузка). |
pdf_mode | Необязательно, только для категории image. «pages» (по умолчанию, растрирует каждую страницу) или «extract» (извлекает встроенные изображения как есть) — актуально только если источник — PDF. |
pdf_pages | Необязательно, только для категории image. «all» (по умолчанию) или «first». |
pdf_quality | Необязательно, только для категории image. «normal» (по умолчанию, 150 DPI) или «high» (300 DPI). |
Частые варианты конвертации
Краткий справочник по популярным парам форматов — один и тот же эндпоинт обрабатывает их все, просто с разным сочетанием category/target.
| Source → target | category | target |
|---|---|---|
| PNG → JPG | image | JPG |
| JPG → PNG | image | PNG |
| HEIC → JPG | image | JPG |
| WEBP → PNG | image | PNG |
| JPG → PDF | image | PDF |
| PDF → JPG | image | JPG |
| DOCX → PDF | document | PDF |
| PDF → DOCX | document | DOCX |
| PPTX → PDF | document | PDF |
| XLSX → PDF | document | PDF |
Ответ
При успехе (200): необработанные байты конвертированного файла с соответствующими заголовками Content-Type и Content-Disposition. При ошибке: JSON-тело вида {"error": {"code": "...", "message": "..."}} с соответствующим HTTP-статусом — см. раздел «Ошибки» ниже.
| Header | Value |
|---|---|
Content-Type | Настоящий MIME-тип конвертированного файла (например, image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — предполагаемое имя файла, как при любой загрузке файла. |
Content-Length | Размер тела ответа в байтах. |
Сжатие
Уменьшите размер файла без изменения формата — на входе и выходе один и тот же формат. Отдельная от конвертации пара категорий, image-compress и document-compress, у каждой свои параметры ниже.
image-compress
На входе и выходе один и тот же формат (JPG/PNG/WEBP/GIF) — target_percent задаёт, насколько маленьким должен получиться результат относительно оригинала, а не фиксированный уровень качества.
| Field | Description |
|---|---|
category | Укажите «image-compress». |
target_percent | Необязательно, 1–100 (по умолчанию 60). Целевой размер как примерный процент от оригинала — чем меньше число, тем сильнее сжатие. |
file | Обязательно. JPG, PNG, WEBP или GIF. |
curl -X POST \ https://transconvert.com/api/v1/convert.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=image-compress" \ -F "target_percent=50" \ -F "file=@photo.jpg" \ -o compressed.jpg
document-compress
PDF на входе, PDF на выходе — через собственное пересжатие Ghostscript. Результат никогда не будет больше загруженного файла (если пересжатие не помогло, возвращается оригинал).
| Field | Description |
|---|---|
category | Укажите «document-compress». |
level | Необязательно: «low», «medium» (по умолчанию), «high» или «none». Более сильное сжатие снижает визуальное качество, в первую очередь у встроенных изображений и сканов. |
grayscale | Необязательно. «1» — также перевести в оттенки серого; не указывайте для сохранения цвета. |
file | Обязательно. PDF без открытой защиты паролем (если она есть, сначала снимите её через инструмент «Снять защиту PDF» на сайте). |
curl -X POST \ https://transconvert.com/api/v1/convert.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=document-compress" \ -F "level=high" \ -F "file=@report.pdf" \ -o compressed.pdf
| Header | Value |
|---|---|
X-Original-Size | Размер загруженного файла в байтах до сжатия. |
X-Saved-Percent | Примерно, насколько результат меньше оригинала, в виде целого процента (может быть 0). |
Видео и аудио (асинхронно)
Конвертация видео и аудио может занимать несколько минут — слишком долго, чтобы держать открытым один синхронный запрос, поэтому вместо эндпоинта выше здесь используется схема «отправить, затем опрашивать». Отправьте файл, сразу получите job_id в ответ, а затем опрашивайте его статус, пока задача не завершится.
Отправка задачи
Тот же формат multipart POST-запроса, что и у основного эндпоинта, но по другому адресу.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Обязательно. «Bearer tc_live_...». |
category | «video» или «audio». |
target | Обязательно — например, «MP4», «MOV», «MP3», «WAV». |
file | Обязательно. Файл для конвертации (multipart-загрузка). |
webhook_url | Необязательно. URL-адрес http(s), на который будет отправлен (POST) результат задания по завершении, вместо того чтобы только опрашивать job-status.php. Должен указывать на публичный адрес. |
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"
Ответ (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Опрос статуса
Опрашивайте этот адрес каждые несколько секунд, передавая полученный job_id. «status» принимает одно из значений: queued, processing, completed или failed.
https://transconvert.com/api/v1/job-status.php?job_id=job_...
{
"job_id": "job_242e1555d78d166807aa56502f15d118",
"status": "completed",
"category": "video",
"target_format": "MP4",
"created_at": "2026-08-26 19:17:47",
"download_url": "/api/v1/job-status.php?job_id=job_...&download=1",
"filename": "clip.mp4"
}
Вебхуки (необязательно)
Если вы указали webhook_url при отправке, мы один раз отправим туда тот же JSON, когда задание завершится — при успехе или ошибке — с несколькими повторными попытками, если ваш эндпоинт не отвечает. job-status.php по-прежнему работает как резервный вариант.
POST your webhook_url { "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "completed", "category": "video", "target_format": "MP4", "created_at": "2026-08-26 19:17:47", "download_url": "https://transconvert.com/api/v1/job-status.php?job_id=job_...&download=1", "filename": "clip.mp4" }
Скачивание результата
Когда status становится «completed», в ответе появляется download_url — тот же адрес статуса с добавленным &download=1. Запрос по нему передаёт необработанные байты конвертированного файла с теми же заголовками, что и у остальных эндпоинтов на этой странице. Результат удаляется сразу после скачивания либо автоматически по истечении короткого срока хранения, если его так и не скачали.
scheduleРезультаты задач удаляются сразу после скачивания либо автоматически по истечении короткого срока хранения, если их так и не скачали — скачивайте их не откладывая.
Примеры
Один и тот же запрос на четырёх языках — выберите тот, что подходит вашему стеку. Каждый пример конвертирует локальный файл photo.jpg в PNG и сохраняет результат.
curl -X POST \ https://transconvert.com/api/v1/convert.php \ -H "Authorization: Bearer tc_live_your_key_here" \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
<?php $ch = curl_init('https://transconvert.com/api/v1/convert.php'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer tc_live_your_key_here'], CURLOPT_POSTFIELDS => [ 'category' => 'image', 'target' => 'PNG', 'file' => new CURLFile('photo.jpg'), ], ]); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status === 200) { file_put_contents('converted.png', $response); } else { $error = json_decode($response, true); echo $error['error']['message']; }
const form = new FormData(); form.append('category', 'image'); form.append('target', 'PNG'); form.append('file', new Blob([fs.readFileSync('photo.jpg')]), 'photo.jpg'); const res = await fetch('https://transconvert.com/api/v1/convert.php', { method: 'POST', headers: { Authorization: 'Bearer tc_live_your_key_here' }, body: form, }); if (res.ok) { fs.writeFileSync('converted.png', Buffer.from(await res.arrayBuffer())); } else { const { error } = await res.json(); console.error(error.message); }
import requests with open('photo.jpg', 'rb') as f: response = requests.post( 'https://transconvert.com/api/v1/convert.php', headers={'Authorization': 'Bearer tc_live_your_key_here'}, data={'category': 'image', 'target': 'PNG'}, files={'file': f}, ) if response.status_code == 200: with open('converted.png', '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.php') File.open('photo.jpg') do |file| req = Net::HTTP::Post::Multipart.new url, 'category' => 'image', 'target' => 'PNG', 'file' => UploadIO.new(file, 'image/jpeg', 'photo.jpg') 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('converted.png', 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", "image") .addFormDataPart("target", "PNG") .addFormDataPart("file", "photo.jpg", RequestBody.create(new File("photo.jpg"), MediaType.parse("image/jpeg"))) .build(); Request request = new Request.Builder() .url("https://transconvert.com/api/v1/convert.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("converted.png"), response.body().bytes()); } else { System.err.println(response.body().string()); } }
Ошибки
Каждая ошибка возвращает JSON с полем «code», по которому можно ветвить логику в коде, и человекочитаемым «message». Некоторые ошибки содержат дополнительные поля (например, quota_exceeded включает «limit» и «used»).
{
"error": {
"code": "quota_exceeded",
"message": "Monthly API allowance of 5000 conversion-minutes reached.",
"limit": 5000,
"used": 5000
}
}
| 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 missing_target | «target» пусто. |
400 no_file | Файл не был передан или загрузка не удалась — поле должно называться «file». |
413 file_too_large | Файл превышает максимальный размер загрузки для вашего тарифа. |
429 quota_exceeded | Месячная квота минут конвертации по тарифу исчерпана. Обновляется в начале следующего календарного месяца. |
429 concurrency_limit | Для этого аккаунта уже выполняется слишком много конвертаций одновременно (общий лимит с сайтом) — дождитесь завершения одной из них и повторите запрос. |
400/415/422/500/503 conversion_failed | Сам файл не удалось конвертировать — причина указана в «message». Код статуса зависит от причины: 400/415/422 означают, что файл или формат назначения не сработают, сколько бы вы ни повторяли попытку; 500/503 означают проблему на стороне сервера, а 503 — тот случай, когда стоит выполнить короткую повторную попытку. |
405 method_not_allowed | Неверный HTTP-метод — этот эндпоинт принимает только POST. |
400 invalid_target | «target» не является поддерживаемым выходным форматом для этой категории. |
404 job_not_found | Задачи с таким id для этого аккаунта не существует (тот же ответ возвращается и для job_id другого аккаунта — его существование никогда не раскрывается). |
410 result_gone | Задача завершена, но её результат уже удалён (результаты удаляются сразу после скачивания либо автоматически по истечении короткого срока хранения). |
500 storage_failed | Серверу не удалось сохранить загруженный файл для фоновой обработки. Можно безопасно повторить запрос. |
Обработка ошибок и повторные попытки
Ветвите логику по полю JSON «code», а не по тексту «message» — формулировки могут меняться со временем, а код — нет. concurrency_limit имеет смысл повторить через несколько секунд (лимит снимается, как только завершится одна из ваших текущих конвертаций); quota_exceeded сам по себе не исчезнет до следующего месяца, поэтому не повторяйте запрос в цикле. conversion_failed — единственный код, где важен именно HTTP-статус: 503 — временная проблема на стороне сервера, стоит повторить один раз; а 400/415/422/500 означают, что именно эта комбинация файла и формата назначения не сработает, сколько бы раз вы ни отправляли запрос. Проверка размера файла на стороне клиента перед загрузкой позволяет не тратить запрос на заведомый file_too_large.
Тарифы и лимиты
API использует те же лимиты, что и ваш тариф на сайте — отдельно ничего настраивать не нужно.
Basic
bolt2000 минут конвертации / месяц
upload_fileФайлы до 2 GB
sync_alt50 запрос(ов) одновременно
speed30 запросов/минуту
Lite
bolt3000 минут конвертации / месяц
upload_fileФайлы до 4 GB
sync_alt100 запрос(ов) одновременно
speed60 запросов/минуту
Pro
bolt5000 минут конвертации / месяц
upload_fileФайлы до 10 GB
sync_altНеограниченное число запросов одновременно
speed120 запросов/минуту
Team
bolt10000 минут конвертации / месяц
upload_fileФайлы до 20 GB
sync_altНеограниченное число запросов одновременно
speed240 запросов/минуту
tollИспользует общий месячный пул кредитов команды, если он применяется
Как только начинает действовать лимит в минуту, каждый ответ содержит заголовки X-RateLimit-Limit и X-RateLimit-Remaining; ответ 429 также содержит Retry-After (в секундах) — используйте их, чтобы снизить частоту запросов заранее, а не реагировать только после 429.
Поддерживаемые форматы
Тот же самый движок конвертации, что используется на сайте, — ничего не доступно только через API или только на сайте.
Принимается как источник:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Доступно как формат назначения:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Принимается как источник:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Доступно как формат назначения:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Источник и назначение (один и тот же формат на входе и выходе):
JPG, PNG, WEBP, GIF
Источник и назначение (один и тот же формат на входе и выходе):
Источник и назначение (один и тот же формат на входе и выходе):
MP4, MOV, AVI, MKV, WEBM
Источник и назначение (один и тот же формат на входе и выходе):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoКонвертация и сжатие видео и аудио пока доступны только на сайте: синхронный HTTP-запрос плохо подходит для задачи, которая может занимать несколько минут.
Частые вопросы
Пока нет — такие конвертации могут занимать несколько минут, что плохо подходит для одного синхронного HTTP-запроса. Сегодня они доступны на сайте; поддержка в API может появиться, если когда-нибудь будет асинхронная, основанная на задачах версия API.
Доступ к API требует тарифа Basic, Lite, Pro или Team. Если аккаунт переходит на Free — из-за отмены подписки или её истечения — существующие ключи сразу перестают работать. Они автоматически заработают снова, как только аккаунт вернётся на платный тариф — создавать новый ключ не нужно.
В начале каждого календарного месяца, а не в день оплаты подписки.
Пока нет — каждый запрос расходует вашу настоящую месячную квоту. При интеграции используйте небольшие файлы, чтобы её экономить.
В пределах лимита одновременных запросов вашего тарифа (см. раздел «Тарифы и лимиты» выше) — этот лимит общий с конвертациями, которые вы одновременно выполняете на сайте, а не отдельная квота только для API.
Для document-compress — да: результат никогда не будет больше загруженного файла; если пересжатие Ghostscript не помогло, вы получите оригинал без изменений (X-Saved-Percent будет равен 0). Для image-compress target_percent — это ориентир для кодировщика, а не строгая гарантия: уже сильно сжатый исходник может уменьшиться незначительно.
Готовы начать?
Создайте ключ и отправьте первый запрос меньше чем за минуту.
Получить API-ключ