TransConvert API
Converta imagens e documentos via programação com um único endpoint HTTP simples.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Início rápido
Do zero ao seu primeiro arquivo convertido em três passos.
Cadastre-se (ou faça upgrade de uma conta existente) para Basic, Lite, Pro ou Equipe, depois gere uma chave na página da sua conta — você pode voltar e vê-la de novo a qualquer momento.
Envie seu arquivo por POST para o endpoint abaixo como multipart/form-data, com sua chave no cabeçalho Authorization e category + target definidos.
Uma resposta 200 são os bytes brutos do arquivo convertido — salve o corpo da resposta diretamente. Qualquer outra coisa é um erro JSON explicando o que deu errado.
Autenticação
Toda requisição precisa de uma chave de API, enviada como Bearer token no cabeçalho Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Disponível nos planos Basic, Lite, Pro e Equipe. Gere uma chave na sua conta →
Teste sua chave
Uma forma rápida de confirmar que uma chave funciona antes de escrever qualquer código de integração de verdade — isso sozinho não converte nada (nenhum arquivo anexado), mas um 400 no_file em vez de um 401 confirma que a chave em si é válida.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
O endpoint
Um único endpoint cuida de todas as conversões. Envie uma requisição POST multipart/form-data com seu arquivo e os campos abaixo.
https://transconvert.com/api/v1/convert.php
Parâmetros
| Field | Description |
|---|---|
Authorization | Obrigatório. "Bearer tc_live_...". |
category | Obrigatório. "image" ou "document" — para comprimir em vez de converter, veja Comprimir abaixo. |
target | Obrigatório. O código do formato de saída, ex.: "PNG", "DOCX" — veja Formatos suportados abaixo. |
file | Obrigatório. O arquivo a converter (upload multipart). |
pdf_mode | Opcional, somente na categoria image. "pages" (padrão, rasteriza cada página) ou "extract" (extrai as imagens embutidas como estão) — relevante apenas quando a origem é um PDF. |
pdf_pages | Opcional, somente na categoria image. "all" (padrão) ou "first". |
pdf_quality | Opcional, somente na categoria image. "normal" (padrão, 150 DPI) ou "high" (300 DPI). |
Conversões comuns
Uma referência rápida para os pares mais populares — o mesmo endpoint cuida de todos eles, apenas com uma combinação diferente de 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 |
Resposta
Em caso de sucesso (200): os bytes brutos do arquivo convertido, com os cabeçalhos Content-Type e Content-Disposition definidos para ele. Em caso de falha: um corpo JSON no formato {"error": {"code": "...", "message": "..."}} com um código de status HTTP correspondente — veja Erros abaixo.
| Header | Value |
|---|---|
Content-Type | O tipo MIME real do arquivo convertido (ex.: image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — um nome de arquivo sugerido, como em qualquer download de arquivo. |
Content-Length | Tamanho do corpo da resposta em bytes. |
Comprimir
Reduza um arquivo sem mudar o formato — mesmo formato na entrada e na saída. Um par de categorias separado da conversão, image-compress e document-compress, cada uma com suas próprias opções abaixo.
image-compress
Mesmo formato na entrada e na saída (JPG/PNG/WEBP/GIF) — target_percent é o quão pequeno o resultado deve tentar ficar em relação ao original, não uma configuração fixa de qualidade.
| Field | Description |
|---|---|
category | Defina como "image-compress". |
target_percent | Opcional, 1–100 (padrão 60). Tamanho-alvo como uma porcentagem aproximada do original — números menores comprimem mais. |
file | Obrigatório. JPG, PNG, WEBP ou 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 na entrada, PDF na saída, via a própria recompressão do Ghostscript — nunca retorna um arquivo maior do que o enviado (usa o original como alternativa se a recompressão não ajudar).
| Field | Description |
|---|---|
category | Defina como "document-compress". |
level | Opcional: "low", "medium" (padrão), "high" ou "none". Uma compressão maior troca mais qualidade visual, principalmente em imagens/digitalizações embutidas. |
grayscale | Opcional. "1" para também converter para escala de cinza; omita para manter as cores. |
file | Obrigatório. Um PDF que não esteja aberto/protegido por senha (se estiver, use primeiro «Desbloquear PDF» no site). |
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 | O tamanho do arquivo enviado em bytes, antes da compressão. |
X-Saved-Percent | Aproximadamente o quanto o resultado é menor que o original, como uma porcentagem inteira (pode ser 0). |
Vídeo e áudio (assíncrono)
Conversões de vídeo e áudio podem levar minutos — tempo demais para manter uma única requisição síncrona aberta — então elas usam um fluxo de enviar-e-consultar em vez do endpoint acima. Envie um arquivo, receba um job_id na hora e consulte o status até terminar.
Enviar um job
O mesmo formato de POST multipart do endpoint principal, em uma URL diferente.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Obrigatório. "Bearer tc_live_...". |
category | "video" ou "audio". |
target | Obrigatório — ex.: "MP4", "MOV", "MP3", "WAV". |
file | Obrigatório. O arquivo a converter (upload multipart). |
webhook_url | Opcional. Uma URL http(s) para onde o resultado do job será enviado (POST) ao terminar, em vez de apenas consultar job-status.php. Deve resolver para um endereço público. |
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"
Resposta (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Consultar o status
Consulte este endpoint a cada poucos segundos com o job_id que você recebeu. "status" é um destes: queued, processing, completed ou 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"
}
Webhooks (opcional)
Se você informou um webhook_url ao enviar, enviaremos esse mesmo corpo JSON assim que o job terminar — sucesso ou falha — tentando novamente algumas vezes se seu endpoint não responder. O job-status.php continua funcionando como alternativa.
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" }
Baixar o resultado
Quando o status for "completed", a resposta inclui um download_url — a mesma URL de status com &download=1 adicionado. Ao requisitá-la, você recebe os bytes brutos do arquivo convertido, com os mesmos cabeçalhos de qualquer outro endpoint desta página. O resultado é excluído no momento em que é baixado, ou automaticamente após um curto período de retenção caso nunca seja baixado.
scheduleOs resultados dos jobs são excluídos imediatamente após o download, ou automaticamente após um curto período de retenção caso nunca sejam baixados — baixe assim que possível.
Exemplos
A mesma requisição em quatro linguagens — escolha a que combina com sua stack. Cada uma converte um photo.jpg local para PNG e salva o resultado.
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()); } }
Erros
Toda falha retorna um envelope de erro JSON com um "code" no qual seu código pode se basear, além de uma "message" legível por humanos. Alguns erros incluem campos extras (quota_exceeded inclui "limit" e "used", por exemplo).
{
"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 | Nenhum cabeçalho Authorization foi enviado. |
401 invalid_key | A chave não existe, ou foi revogada. |
403 account_suspended | A conta dona dessa chave está suspensa. |
403 plan_required | A conta está no plano Gratuito — o acesso à API exige Basic, Lite, Pro ou Equipe. |
400 invalid_category | "category" não era "image" nem "document". |
400 missing_target | "target" estava vazio. |
400 no_file | Nenhum arquivo foi enviado, ou o upload falhou — o campo precisa se chamar "file". |
413 file_too_large | O arquivo excede o tamanho máximo de upload do seu plano. |
429 quota_exceeded | A cota mensal de minutos de conversão do plano já foi usada. Reinicia no começo do próximo mês do calendário. |
429 concurrency_limit | Já há conversões demais rodando ao mesmo tempo para essa conta (compartilhado com o site) — espere uma terminar e tente de novo. |
400/415/422/500/503 conversion_failed | O próprio arquivo não pôde ser convertido — "message" explica o motivo. O código de status varia conforme o motivo: 400/415/422 significam que o arquivo ou o target não vão funcionar não importa quantas vezes você tente de novo; 500/503 significam um problema do lado do servidor, e 503 especificamente vale a pena tentar de novo em pouco tempo. |
405 method_not_allowed | Método HTTP errado — esse endpoint só aceita POST. |
400 invalid_target | "target" não é um formato de saída compatível para essa categoria. |
404 job_not_found | Não existe nenhum job com esse id para esta conta (também retornado para o job_id de outra conta — sua existência nunca é revelada). |
410 result_gone | O job foi concluído, mas o resultado já foi excluído (os resultados são excluídos imediatamente após o download, ou automaticamente após um curto período de retenção). |
500 storage_failed | O servidor não conseguiu salvar o upload para processamento em segundo plano. Pode tentar de novo com segurança. |
Lidando com erros e novas tentativas
Baseie sua lógica no campo JSON "code", não no texto de "message" — a redação pode mudar com o tempo, o código não. concurrency_limit vale a pena tentar de novo em poucos segundos (ele se resolve assim que uma das suas conversões em andamento termina); quota_exceeded não se resolve sozinho até o mês seguinte, então não tente de novo em loop. conversion_failed é o único código em que o status HTTP ainda importa: um 503 é um problema passageiro do lado do servidor que vale uma nova tentativa curta, enquanto 400/415/422/500 significam que aquela combinação exata de arquivo/target não vai funcionar não importa quantas vezes você reenvie. Verificar o tamanho de um arquivo no lado do cliente antes de enviar evita gastar uma requisição com um file_too_large garantido.
Planos e limites
A API compartilha os limites do mesmo plano que você já usa no site — nada separado para configurar.
Basic
bolt2000 minutos de conversão / mês
upload_fileArquivos de até 2 GB
sync_alt50 requisição(ões) por vez
speed30 solicita\u00e7\u00f5es/minuto
Lite
bolt3000 minutos de conversão / mês
upload_fileArquivos de até 4 GB
sync_alt100 requisição(ões) por vez
speed60 solicita\u00e7\u00f5es/minuto
Pro
bolt5000 minutos de conversão / mês
upload_fileArquivos de até 10 GB
sync_altRequisições ilimitadas por vez
speed120 solicita\u00e7\u00f5es/minuto
Equipe
bolt10000 minutos de conversão / mês
upload_fileArquivos de até 20 GB
sync_altRequisições ilimitadas por vez
speed240 solicita\u00e7\u00f5es/minuto
tollCompartilhado com o pool de créditos mensal da equipe, se ela usar um
Quando um limite por minuto se aplica, cada resposta inclui os cabeçalhos X-RateLimit-Limit e X-RateLimit-Remaining; uma resposta 429 também inclui Retry-After (em segundos) — use-os para desacelerar antes de atingir o limite, em vez de reagir somente após um 429.
Formatos suportados
Exatamente o mesmo mecanismo de conversão que o site usa — nada é exclusivo da API ou exclusivo do site.
Aceito como origem:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Disponível como destino:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Aceito como origem:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Disponível como destino:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Origem e destino (mesmo formato na entrada e na saída):
JPG, PNG, WEBP, GIF
Origem e destino (mesmo formato na entrada e na saída):
Origem e destino (mesmo formato na entrada e na saída):
MP4, MOV, AVI, MKV, WEBM
Origem e destino (mesmo formato na entrada e na saída):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoVídeo e áudio — tanto conversão quanto compressão — são exclusivos do site por enquanto: uma chamada HTTP síncrona não é adequada para uma tarefa que pode levar vários minutos.
Perguntas frequentes
Ainda não — essas conversões podem levar vários minutos, o que não combina bem com uma única requisição HTTP síncrona. Elas já estão disponíveis no site hoje; o suporte na API pode vir se um dia existir uma versão assíncrona/baseada em jobs da API.
O acesso à API exige Basic, Lite, Pro ou Equipe. Se a conta passar para o Gratuito — por cancelamento, ou uma assinatura vencida — as chaves existentes param de funcionar imediatamente. Elas voltam a funcionar automaticamente se a conta retornar a um plano pago; você não precisa gerar uma nova.
No início de cada mês do calendário, não na sua data de cobrança.
No momento não — toda requisição conta na sua cota mensal real. Use arquivos pequenos durante a integração para economizar.
Até o limite de concorrência do seu plano (veja Planos e limites acima) — compartilhado com quaisquer conversões que você também esteja rodando no site ao mesmo tempo, não é uma cota separada só para a API.
Para document-compress, sim — nunca devolve um PDF maior do que o enviado; se a recompressão do Ghostscript não ajudou, você recebe o original sem alterações (X-Saved-Percent mostrará 0). Para image-compress, target_percent é uma meta que o codificador tenta alcançar, não uma garantia absoluta — uma origem já muito comprimida pode não encolher muito mais.
Pronto para começar?
Gere uma chave e faça sua primeira requisição em menos de um minuto.
Obtenha sua chave de API