Image Compression API
Shrink JPG, PNG, WEBP, and GIF files with one POST request — same format in, same format out, aimed at a target percentage of the original size.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image-compress" \ -F "target_percent=50" \ -F "file=@photo.jpg" \ -o output.jpg
https://transconvert.com/api/v1/convert.php
Parâmetros
| Field | Description |
|---|---|
Authorization | Required. "Bearer tc_live_...". |
category | Set to "image-compress". |
target_percent | Optional, 1–100 (default 60). Target size as a rough percentage of the original — smaller compresses harder. |
file | Required. JPG, PNG, WEBP, or GIF. |
Exemplos
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 output.jpg
<?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-compress', 'target_percent' => '50', 'file' => new CURLFile('photo.jpg'), ], ]); $response = curl_exec($ch); $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($status === 200) { file_put_contents('output.jpg', $response); } else { $error = json_decode($response, true); echo $error['error']['message']; }
const form = new FormData(); form.append('category', 'image-compress'); form.append('target_percent', '50'); 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('output.jpg', 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-compress', 'target_percent': '50'}, files={'file': f}, ) if response.status_code == 200: with open('output.jpg', '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-compress', 'target_percent' => '50', 'file' => UploadIO.new(file, 'application/octet-stream', '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('output.jpg', 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-compress") .addFormDataPart("target_percent", "50") .addFormDataPart("file", "photo.jpg", RequestBody.create(new File("photo.jpg"), MediaType.parse("application/octet-stream"))) .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("output.jpg"), response.body().bytes()); } else { System.err.println(response.body().string()); } }
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. |
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). |
Todo erro segue o mesmo formato JSON, por exemplo quando uma cota é excedida:
{
"error": {
"code": "quota_exceeded",
"message": "Monthly API allowance of 5000 conversion-minutes reached.",
"limit": 5000,
"used": 5000
}
}
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).
| 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 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. |
422 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. |
Supported formats
JPG, PNG, WEBP, GIF