TransConvert API
Konversi gambar dan dokumen secara programatis melalui satu endpoint HTTP yang sederhana.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Mulai cepat
Dari nol hingga file konversi pertama Anda dalam tiga langkah.
Daftar (atau tingkatkan akun yang sudah ada) ke paket Basic, Lite, Pro, atau Tim, lalu buat kunci dari halaman akun Anda — Anda dapat kembali dan melihatnya lagi kapan saja.
Kirim (POST) file Anda ke endpoint di bawah sebagai multipart/form-data, dengan kunci Anda di header Authorization serta category dan target yang sudah diisi.
Respons 200 berisi byte mentah file hasil konversi — simpan langsung isi respons tersebut. Selain itu, responsnya berupa kesalahan JSON yang menjelaskan apa yang salah.
Autentikasi
Setiap permintaan memerlukan kunci API, yang dikirim sebagai Bearer token di header Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Tersedia di paket Basic, Lite, Pro, dan Tim. Buat kunci dari akun Anda →
Uji kunci Anda
Cara cepat memastikan kunci Anda berfungsi sebelum menulis kode integrasi sesungguhnya — permintaan ini sendiri tidak mengonversi apa pun (tidak ada file terlampir), tetapi respons 400 no_file (bukan 401) sudah memastikan kunci itu sendiri valid.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
Endpoint
Satu endpoint menangani semua konversi. Kirim permintaan POST multipart/form-data berisi file Anda beserta kolom-kolom di bawah ini.
https://transconvert.com/api/v1/convert.php
Parameter
| Field | Description |
|---|---|
Authorization | Wajib. "Bearer tc_live_...". |
category | Wajib. "image" atau "document" — untuk mengompres alih-alih mengonversi, lihat bagian Kompres di bawah. |
target | Wajib. Kode format keluaran, mis. "PNG", "DOCX" — lihat bagian Format yang didukung di bawah. |
file | Wajib. File yang akan dikonversi (unggahan multipart). |
pdf_mode | Opsional, hanya untuk kategori image. "pages" (default, merasterisasi setiap halaman) atau "extract" (mengambil gambar tersemat apa adanya) — hanya berlaku jika sumbernya berupa PDF. |
pdf_pages | Opsional, hanya untuk kategori image. "all" (default) atau "first". |
pdf_quality | Opsional, hanya untuk kategori image. "normal" (default, 150 DPI) atau "high" (300 DPI). |
Konversi umum
Referensi cepat untuk pasangan format populer — endpoint yang sama menangani semuanya, hanya dengan kombinasi category/target yang berbeda.
| 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 |
Respons
Jika berhasil (200): byte mentah file hasil konversi, dengan header Content-Type dan Content-Disposition yang sesuai. Jika gagal: isi JSON berbentuk {"error": {"code": "...", "message": "..."}} dengan kode status HTTP yang sesuai — lihat bagian Kesalahan di bawah.
| Header | Value |
|---|---|
Content-Type | Tipe MIME sebenarnya dari file hasil konversi (mis. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — nama file yang disarankan, sama seperti unduhan file pada umumnya. |
Content-Length | Ukuran isi respons dalam byte. |
Kompres
Perkecil ukuran file tanpa mengubah formatnya — format masuk sama dengan format keluar. Ini adalah pasangan kategori terpisah dari konversi, yaitu image-compress dan document-compress, masing-masing dengan opsinya sendiri di bawah.
image-compress
Format masuk sama dengan format keluar (JPG/PNG/WEBP/GIF) — target_percent menentukan seberapa kecil hasil yang ditargetkan relatif terhadap file asli, bukan pengaturan kualitas tetap.
| Field | Description |
|---|---|
category | Diisi dengan "image-compress". |
target_percent | Opsional, 1–100 (default 60). Ukuran target sebagai perkiraan persentase dari file asli — semakin kecil angkanya, semakin kuat kompresinya. |
file | Wajib. JPG, PNG, WEBP, atau 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 masuk, PDF keluar, melalui pemampatan ulang milik Ghostscript sendiri — tidak akan pernah mengembalikan file yang lebih besar dari yang diunggah (kembali ke file asli jika pemampatan ulang tidak membantu).
| Field | Description |
|---|---|
category | Diisi dengan "document-compress". |
level | Opsional: "low", "medium" (default), "high", atau "none". Kompresi yang lebih tinggi mengorbankan lebih banyak kualitas visual, terutama pada gambar/hasil pindai tersemat. |
grayscale | Opsional. "1" untuk sekaligus mengonversi ke grayscale; kosongkan untuk warna penuh. |
file | Wajib. PDF yang tidak dilindungi kata sandi (gunakan Buka Kunci PDF di situs terlebih dahulu jika masih terkunci). |
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 | Ukuran file yang diunggah dalam byte, sebelum kompresi. |
X-Saved-Percent | Perkiraan seberapa lebih kecil hasilnya dibandingkan file asli, dalam persentase bilangan bulat (bisa 0). |
Video & audio (asinkron)
Konversi video dan audio bisa berjalan selama beberapa menit — terlalu lama untuk mempertahankan satu permintaan sinkron tetap terbuka — sehingga menggunakan alur submit-lalu-poll, bukan endpoint di atas. Kirim sebuah file, dapatkan job_id sebagai balasan langsung, lalu poll statusnya sampai selesai.
Kirim tugas
Bentuk POST multipart yang sama seperti endpoint utama, hanya di URL yang berbeda.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Wajib. "Bearer tc_live_...". |
category | "video" atau "audio". |
target | Wajib diisi — mis. "MP4", "MOV", "MP3", "WAV". |
file | Wajib. File yang akan dikonversi (unggahan multipart). |
webhook_url | Opsional. URL http(s) untuk mem-POST hasil job saat selesai, alih-alih hanya melakukan polling ke job-status.php. Harus dapat diresolusi ke alamat publik. |
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"
Respons (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Poll status
Poll endpoint ini setiap beberapa detik menggunakan job_id yang Anda terima. "status" berupa salah satu dari queued, processing, completed, atau 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 (opsional)
Jika Anda memberikan webhook_url saat mengirim, kami akan mem-POST isi JSON yang sama ke sana satu kali setelah job selesai — berhasil atau gagal — mencoba beberapa kali lagi jika endpoint Anda tidak merespons. job-status.php tetap berfungsi sebagai cadangan.
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" }
Unduh hasilnya
Setelah status menjadi "completed", respons menyertakan download_url — URL status yang sama dengan tambahan &download=1. Meminta URL ini akan menstream byte mentah file hasil konversi, dengan header yang sama seperti endpoint lain di halaman ini. Hasil akan dihapus begitu diunduh, atau otomatis dihapus setelah periode penyimpanan singkat jika tidak pernah diunduh.
scheduleHasil tugas dihapus segera setelah diunduh, atau otomatis dihapus setelah periode penyimpanan singkat jika tidak pernah diunduh — segera unduh.
Contoh
Permintaan yang sama dalam empat bahasa pemrograman — pilih yang sesuai dengan stack Anda. Masing-masing mengonversi file lokal photo.jpg ke PNG lalu menyimpan hasilnya.
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()); } }
Kesalahan
Setiap kegagalan mengembalikan bungkus kesalahan JSON berisi "code" yang dapat digunakan kode Anda untuk pencabangan logika, ditambah "message" yang mudah dibaca manusia. Beberapa kesalahan menyertakan kolom tambahan (misalnya, quota_exceeded menyertakan "limit" dan "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 | Header Authorization tidak dikirim. |
401 invalid_key | Kunci tidak ada, atau sudah dicabut. |
403 account_suspended | Akun pemilik kunci ini telah ditangguhkan. |
403 plan_required | Akun berada di paket Gratis — akses API memerlukan paket Basic, Lite, Pro, atau Tim. |
400 invalid_category | "category" bukan "image" atau "document". |
400 missing_target | "target" kosong. |
400 no_file | Tidak ada file yang dikirim, atau unggahan gagal — kolom harus diberi nama "file". |
413 file_too_large | Ukuran file melebihi batas unggah maksimum paket Anda. |
429 quota_exceeded | Jatah menit konversi bulanan paket Anda telah habis. Akan diatur ulang di awal bulan kalender berikutnya. |
429 concurrency_limit | Terlalu banyak konversi yang berjalan bersamaan untuk akun ini (dibagi dengan situs web) — tunggu salah satunya selesai lalu coba lagi. |
400/415/422/500/503 conversion_failed | File itu sendiri tidak dapat dikonversi — "message" menjelaskan alasannya. Kode status bervariasi tergantung alasannya: 400/415/422 berarti file atau target tidak akan pernah berhasil sebanyak apa pun Anda mencoba ulang; 500/503 berarti ada masalah di sisi server, dan khusus 503 layak dicoba ulang sebentar lagi. |
405 method_not_allowed | Metode HTTP salah — endpoint ini hanya menerima POST. |
400 invalid_target | "target" bukan format keluaran yang didukung untuk kategori tersebut. |
404 job_not_found | Tidak ada tugas dengan id tersebut untuk akun ini (juga dikembalikan untuk job_id milik akun lain — keberadaannya tidak pernah diungkapkan). |
410 result_gone | Tugas telah selesai, tetapi hasilnya sudah dihapus (hasil dihapus segera setelah diunduh, atau otomatis setelah periode penyimpanan singkat). |
500 storage_failed | Server tidak dapat menyimpan unggahan untuk diproses di latar belakang. Aman untuk dicoba lagi. |
Menangani kesalahan & percobaan ulang
Gunakan kolom JSON "code" untuk pencabangan logika, bukan teks "message" — kata-katanya bisa berubah seiring waktu, kodenya tidak. concurrency_limit layak dicoba ulang sebentar setelah beberapa detik (kondisi ini hilang begitu salah satu konversi Anda yang sedang berjalan selesai); quota_exceeded tidak akan pulih dengan sendirinya sampai bulan berikutnya, jadi jangan mencoba ulang dalam sebuah loop. conversion_failed adalah satu-satunya kode di mana status HTTP masih penting: 503 adalah masalah sementara di sisi server yang layak dicoba ulang sekali secara singkat, sedangkan 400/415/422/500 berarti kombinasi file/target tersebut tidak akan pernah berhasil sebanyak apa pun Anda mengirim ulang. Memeriksa ukuran file di sisi klien sebelum mengunggah akan menghindarkan Anda dari permintaan yang sia-sia karena sudah pasti akan menghasilkan file_too_large.
Paket & batas
Batas API mengikuti paket yang sama dengan yang Anda gunakan di situs web — tidak ada konfigurasi terpisah yang diperlukan.
Basic
bolt2000 menit konversi / bulan
upload_fileFile hingga 2 GB
sync_alt50 permintaan sekaligus
speed30 permintaan/menit
Lite
bolt3000 menit konversi / bulan
upload_fileFile hingga 4 GB
sync_alt100 permintaan sekaligus
speed60 permintaan/menit
Pro
bolt5000 menit konversi / bulan
upload_fileFile hingga 10 GB
sync_altPermintaan sekaligus tanpa batas
speed120 permintaan/menit
Tim
bolt10000 menit konversi / bulan
upload_fileFile hingga 20 GB
sync_altPermintaan sekaligus tanpa batas
speed240 permintaan/menit
tollDibagi dengan kuota kredit bulanan tim, jika tim menggunakannya
Setelah batas per menit berlaku, setiap respons menyertakan header X-RateLimit-Limit dan X-RateLimit-Remaining; respons 429 juga menyertakan Retry-After (dalam detik) — gunakan ini untuk memperlambat sebelum mencapai batas, alih-alih baru bereaksi setelah menerima 429.
Format yang didukung
Menggunakan mesin konversi yang persis sama dengan situs web — tidak ada yang eksklusif untuk API atau eksklusif untuk situs web.
Diterima sebagai sumber:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Tersedia sebagai target:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Diterima sebagai sumber:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Tersedia sebagai target:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Sumber dan target (format masuk sama dengan format keluar):
JPG, PNG, WEBP, GIF
Sumber dan target (format masuk sama dengan format keluar):
Sumber dan target (format masuk sama dengan format keluar):
MP4, MOV, AVI, MKV, WEBM
Sumber dan target (format masuk sama dengan format keluar):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoVideo dan audio — baik konversi maupun kompresi — untuk saat ini hanya tersedia di situs web: panggilan HTTP sinkron kurang cocok untuk proses yang bisa memakan waktu beberapa menit.
Pertanyaan yang sering diajukan
Belum — konversi semacam itu bisa memakan waktu beberapa menit, yang kurang cocok untuk satu permintaan HTTP sinkron. Saat ini konversi tersebut tersedia di situs web; dukungan API mungkin menyusul jika suatu saat ada versi API berbasis async/job.
Akses API memerlukan paket Basic, Lite, Pro, atau Tim. Jika akun berpindah ke paket Gratis — karena pembatalan, atau langganan yang berakhir — kunci yang sudah ada langsung berhenti berfungsi. Kunci tersebut akan otomatis berfungsi kembali begitu akun kembali ke paket berbayar; Anda tidak perlu membuat kunci baru.
Di awal setiap bulan kalender, bukan pada tanggal penagihan Anda.
Belum saat ini — setiap permintaan mengurangi jatah bulanan Anda yang sebenarnya. Gunakan file berukuran kecil selama proses integrasi untuk menghemat jatah tersebut.
Hingga batas konversi bersamaan paket Anda (lihat Paket & batas di atas) — dibagi dengan konversi yang mungkin sedang Anda jalankan di situs web pada saat bersamaan, bukan jatah terpisah khusus API.
Untuk document-compress, ya — file ini tidak akan pernah mengembalikan PDF yang lebih besar dari yang diunggah; jika pemampatan ulang Ghostscript tidak membantu, Anda akan menerima kembali file asli tanpa perubahan (X-Saved-Percent akan bernilai 0). Untuk image-compress, target_percent adalah target yang dituju oleh encoder, bukan jaminan mutlak — sumber yang sudah sangat terkompresi mungkin tidak akan mengecil banyak lagi.
Siap untuk memulai?
Buat kunci dan kirim permintaan pertama Anda dalam waktu kurang dari satu menit.
Dapatkan kunci API Anda