API di TransConvert
Converti immagini e documenti in modo programmatico con un unico e semplice endpoint HTTP.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Guida rapida
Dal via al tuo primo file convertito in tre passaggi.
Registrati (oppure esegui l'upgrade di un account esistente) a Basic, Lite, Pro o Team, poi genera una chiave dalla pagina del tuo account — potrai tornare a visualizzarla in qualsiasi momento.
Invia il tuo file con una richiesta POST all'endpoint qui sotto come multipart/form-data, con la tua chiave nell'header Authorization e category + target impostati.
Una risposta 200 corrisponde ai byte grezzi del file convertito — salva direttamente il corpo della risposta. Qualsiasi altra risposta è un errore JSON che spiega cosa è andato storto.
Autenticazione
Ogni richiesta richiede una chiave API, inviata come Bearer token nell'header Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Disponibile nei piani Basic, Lite, Pro e Team. Genera una chiave dal tuo account →
Testa la tua chiave
Un modo rapido per verificare che una chiave funzioni prima di scrivere codice di integrazione vero e proprio — da solo questo non converte nulla (nessun file allegato), ma un 400 no_file invece di un 401 conferma che la chiave è valida.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
L'endpoint
Un unico endpoint gestisce tutte le conversioni. Invia una richiesta POST multipart/form-data con il tuo file e i campi qui sotto.
https://transconvert.com/api/v1/convert.php
Parametri
| Field | Description |
|---|---|
Authorization | Obbligatorio. "Bearer tc_live_...". |
category | Obbligatorio. "image" oppure "document" — per comprimere anziché convertire, vedi Compressione qui sotto. |
target | Obbligatorio. Il codice del formato di output, es. "PNG", "DOCX" — vedi Formati supportati qui sotto. |
file | Obbligatorio. Il file da convertire (upload multipart). |
pdf_mode | Facoltativo, solo per la categoria image. "pages" (predefinito, rasterizza ogni pagina) oppure "extract" (estrae le immagini incorporate così come sono) — rilevante solo quando il file di origine è un PDF. |
pdf_pages | Facoltativo, solo per la categoria image. "all" (predefinito) oppure "first". |
pdf_quality | Facoltativo, solo per la categoria image. "normal" (predefinito, 150 DPI) oppure "high" (300 DPI). |
Conversioni comuni
Un riferimento rapido per le combinazioni più diffuse — lo stesso endpoint le gestisce tutte, cambia solo la combinazione di 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 |
Risposta
In caso di successo (200): i byte grezzi del file convertito, con gli header Content-Type e Content-Disposition impostati di conseguenza. In caso di errore: un corpo JSON con la forma {"error": {"code": "...", "message": "..."}} e un codice di stato HTTP corrispondente — vedi Errori qui sotto.
| Header | Value |
|---|---|
Content-Type | Il vero tipo MIME del file convertito (es. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — un nome file suggerito, come in qualsiasi download di file. |
Content-Length | Dimensione del corpo della risposta in byte. |
Compressione
Riduci le dimensioni di un file senza cambiarne il formato — stesso formato in entrata e in uscita. Una coppia di categorie separata dalla conversione, image-compress e document-compress, ciascuna con le proprie opzioni qui sotto.
image-compress
Stesso formato in entrata e in uscita (JPG/PNG/WEBP/GIF) — target_percent indica quanto dovrebbe essere piccolo il risultato rispetto all'originale, non è un'impostazione di qualità fissa.
| Field | Description |
|---|---|
category | Impostalo su "image-compress". |
target_percent | Facoltativo, 1–100 (predefinito 60). Dimensione target come percentuale approssimativa dell'originale — numeri più bassi comprimono di più. |
file | Obbligatorio. JPG, PNG, WEBP o 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 in entrata, PDF in uscita, tramite la ricompressione di Ghostscript — non restituisce mai un file più grande di quello caricato (torna all'originale se la ricompressione non ha aiutato).
| Field | Description |
|---|---|
category | Impostalo su "document-compress". |
level | Facoltativo: "low", "medium" (predefinito), "high" oppure "none". Una compressione più alta sacrifica più qualità visiva, soprattutto su immagini/scansioni incorporate. |
grayscale | Facoltativo. "1" per convertire anche in scala di grigi; ometti per i colori completi. |
file | Obbligatorio. Un PDF che non sia protetto da password/apertura (se lo è, usa prima Sblocca PDF sul sito). |
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 | La dimensione del file caricato in byte, prima della compressione. |
X-Saved-Percent | Una stima approssimativa di quanto è più piccolo il risultato rispetto all'originale, come percentuale intera (può essere 0). |
Video e audio (asincrono)
Le conversioni video e audio possono richiedere diversi minuti, troppo a lungo per mantenere aperta una singola richiesta sincrona — per questo usano un flusso di invio e polling invece dell’endpoint qui sopra. Invia un file, ricevi subito un job_id, poi interroga lo stato finché non è completato.
Invia un job
Stessa struttura POST multipart dell’endpoint principale, su un URL diverso.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Obbligatorio. "Bearer tc_live_...". |
category | «video» oppure «audio». |
target | Obbligatorio — ad es. «MP4», «MOV», «MP3», «WAV». |
file | Obbligatorio. Il file da convertire (upload multipart). |
webhook_url | Facoltativo. Un URL http(s) a cui inviare (POST) il risultato del job al termine, invece di limitarsi a interrogare job-status.php. Deve risolversi in un indirizzo pubblico. |
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"
Risposta (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Interroga lo stato
Interroga questo endpoint ogni pochi secondi con il job_id ricevuto. «status» può essere queued, processing, completed o 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 (facoltativo)
Se hai fornito un webhook_url all'invio, invieremo lo stesso corpo JSON una volta terminato il job — successo o fallimento — riprovando alcune volte se il tuo endpoint non risponde. job-status.php resta comunque disponibile come 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" }
Scarica il risultato
Quando lo stato è «completed», la risposta include un download_url — lo stesso URL di stato con &download=1 aggiunto. Richiamandolo si ottiene lo streaming dei byte grezzi del file convertito, con le stesse intestazioni di ogni altro endpoint di questa pagina. Il risultato viene eliminato nel momento in cui viene scaricato, oppure automaticamente dopo un breve periodo di conservazione se non viene mai scaricato.
scheduleI risultati dei job vengono eliminati immediatamente dopo il download, oppure automaticamente dopo un breve periodo di conservazione se non vengono mai scaricati — scaricali tempestivamente.
Esempi
La stessa richiesta in quattro linguaggi — scegli quello che corrisponde al tuo stack. Ognuno converte un file locale photo.jpg in PNG e salva il risultato.
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()); } }
Errori
Ogni errore restituisce un involucro JSON con un "code" su cui il tuo codice può ramificarsi, più un "message" leggibile. Alcuni errori includono campi aggiuntivi (quota_exceeded include ad esempio "limit" e "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 | Non è stato inviato alcun header Authorization. |
401 invalid_key | La chiave non esiste, oppure è stata revocata. |
403 account_suspended | L'account proprietario di questa chiave è sospeso. |
403 plan_required | L'account è sul piano Free — l'accesso API richiede Basic, Lite, Pro o Team. |
400 invalid_category | "category" non era "image" né "document". |
400 missing_target | "target" era vuoto. |
400 no_file | Non è stato inviato alcun file, oppure l'upload è fallito — il campo deve chiamarsi "file". |
413 file_too_large | Il file supera la dimensione massima di caricamento del tuo piano. |
429 quota_exceeded | La quota mensile di minuti di conversione del piano è esaurita. Si azzera all'inizio del mese solare successivo. |
429 concurrency_limit | Troppe conversioni già in corso contemporaneamente per questo account (condiviso con il sito) — attendi che una finisca e riprova. |
400/415/422/500/503 conversion_failed | Il file stesso non è stato convertibile — "message" spiega il motivo. Il codice di stato varia in base al motivo: 400/415/422 indicano che il file o il target non funzioneranno indipendentemente da quanti tentativi fai; 500/503 indicano un problema lato server, e in particolare il 503 vale la pena riprovarlo dopo poco. |
405 method_not_allowed | Metodo HTTP errato — questo endpoint accetta solo richieste POST. |
400 invalid_target | «target» non è un formato di output supportato per quella categoria. |
404 job_not_found | Non esiste alcun job con questo id per questo account (restituito anche per il job_id di un altro account — la sua esistenza non viene mai rivelata). |
410 result_gone | Il job è stato completato, ma il suo risultato è stato nel frattempo eliminato (i risultati vengono eliminati immediatamente dopo il download, oppure automaticamente dopo un breve periodo di conservazione). |
500 storage_failed | Il server non è riuscito a salvare il file caricato per l’elaborazione in background. Puoi riprovare senza problemi. |
Gestione di errori e ritentativi
Basa la logica sul campo JSON "code", non sul testo di "message" — il testo può cambiare nel tempo, il code no. concurrency_limit vale la pena riprovarlo dopo pochi secondi (si libera non appena una delle tue conversioni in corso termina); quota_exceeded non si risolve da solo fino al mese successivo, quindi non riprovare in un ciclo. conversion_failed è l'unico code in cui lo stato HTTP conta ancora: un 503 è un problema temporaneo lato server che vale un breve ritentativo, mentre 400/415/422/500 indicano che quella precisa combinazione di file/target non avrà successo indipendentemente da quante volte la reinvii. Controllare la dimensione del file lato client prima del caricamento evita di sprecare una richiesta su un file_too_large già certo.
Piani e limiti
L'API condivide i limiti con lo stesso piano che già usi sul sito — non c'è nulla da configurare separatamente.
Basic
bolt2000 minuti di conversione al mese
upload_fileFile fino a 2 GB
sync_alt50 richiesta/e alla volta
speed30 richieste/minuto
Lite
bolt3000 minuti di conversione al mese
upload_fileFile fino a 4 GB
sync_alt100 richiesta/e alla volta
speed60 richieste/minuto
Pro
bolt5000 minuti di conversione al mese
upload_fileFile fino a 10 GB
sync_altRichieste illimitate contemporaneamente
speed120 richieste/minuto
Team
bolt10000 minuti di conversione al mese
upload_fileFile fino a 20 GB
sync_altRichieste illimitate contemporaneamente
speed240 richieste/minuto
tollCondiviso con il pool mensile di crediti del team, se ne usa uno
Quando si applica un limite al minuto, ogni risposta include le intestazioni X-RateLimit-Limit e X-RateLimit-Remaining; una risposta 429 include anche Retry-After (in secondi) — usateli per rallentare prima di raggiungere il limite, invece di reagire solo dopo un 429.
Formati supportati
Esattamente lo stesso motore di conversione usato dal sito — nulla è esclusivo dell'API o del sito.
Accettati come origine:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Disponibili come destinazione:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Accettati come origine:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Disponibili come destinazione:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Origine e destinazione (stesso formato in entrata e in uscita):
JPG, PNG, WEBP, GIF
Origine e destinazione (stesso formato in entrata e in uscita):
Origine e destinazione (stesso formato in entrata e in uscita):
MP4, MOV, AVI, MKV, WEBM
Origine e destinazione (stesso formato in entrata e in uscita):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoVideo e audio — sia la conversione che la compressione — sono per ora disponibili solo sul sito: una chiamata HTTP sincrona non è adatta a un'elaborazione che può richiedere diversi minuti.
Domande frequenti
Non ancora — queste conversioni possono richiedere diversi minuti, il che si adatta male a una singola richiesta HTTP sincrona. Sono disponibili oggi sul sito; il supporto API potrebbe arrivare in futuro se un giorno nascerà una versione asincrona/basata su job dell'API.
L'accesso API richiede Basic, Lite, Pro o Team. Se l'account passa a Free — per una cancellazione o per la scadenza dell'abbonamento — le chiavi esistenti smettono di funzionare immediatamente. Tornano a funzionare automaticamente se l'account torna a un piano a pagamento; non serve generarne una nuova.
All'inizio di ogni mese solare, non alla data di fatturazione.
Non al momento — ogni richiesta viene conteggiata sulla tua quota mensile reale. Usa file piccoli durante l'integrazione per risparmiarla.
Fino al limite di contemporaneità del tuo piano (vedi Piani e limiti qui sopra) — condiviso con eventuali conversioni che stai eseguendo contemporaneamente anche sul sito, non è una quota separata riservata solo all'API.
Per document-compress, sì — non restituisce mai un PDF più grande di quello caricato; se la ricompressione di Ghostscript non ha aiutato, ricevi indietro l'originale invariato (X-Saved-Percent sarà 0). Per image-compress, target_percent è un obiettivo a cui punta l'encoder, non una garanzia assoluta — un file di origine già pesantemente compresso potrebbe non ridursi molto di più.
Pronto a iniziare?
Genera una chiave e fai la tua prima richiesta in meno di un minuto.
Ottieni la tua chiave API