API TransConvert
Convertissez des images et des documents par programmation grâce à un point de terminaison HTTP unique et simple.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Démarrage rapide
De zéro à votre premier fichier converti en trois étapes.
Inscrivez-vous (ou passez un compte existant) à l’offre Basic, Lite, Pro ou Team, puis générez une clé depuis votre page de compte — vous pourrez revenir la consulter à tout moment.
Envoyez votre fichier en POST vers le point de terminaison ci-dessous en multipart/form-data, avec votre clé dans l’en-tête Authorization et category + target définis.
Une réponse 200 correspond aux octets bruts du fichier converti — enregistrez directement le corps de la réponse. Toute autre réponse est une erreur JSON expliquant ce qui s’est mal passé.
Authentification
Chaque requête nécessite une clé API, envoyée comme jeton Bearer dans l’en-tête Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Disponible avec les offres Basic, Lite, Pro et Team. Générez une clé depuis votre compte →
Testez votre clé
Un moyen rapide de vérifier qu’une clé fonctionne avant d’écrire du code d’intégration réel — ceci seul ne convertira rien (aucun fichier joint), mais un 400 no_file plutôt qu’un 401 confirme que la clé elle-même est valide.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
Le point de terminaison
Un seul point de terminaison gère toutes les conversions. Envoyez une requête POST multipart/form-data avec votre fichier et les champs ci-dessous.
https://transconvert.com/api/v1/convert.php
Paramètres
| Field | Description |
|---|---|
Authorization | Obligatoire. "Bearer tc_live_...". |
category | Obligatoire. "image" ou "document" — pour compresser plutôt que convertir, voir Compression ci-dessous. |
target | Obligatoire. Le code du format de sortie, par ex. "PNG", "DOCX" — voir Formats pris en charge ci-dessous. |
file | Obligatoire. Le fichier à convertir (envoi multipart). |
pdf_mode | Facultatif, catégorie image uniquement. "pages" (par défaut, rastérise chaque page) ou "extract" (récupère telles quelles les images intégrées) — pertinent uniquement si la source est un PDF. |
pdf_pages | Facultatif, catégorie image uniquement. "all" (par défaut) ou "first". |
pdf_quality | Facultatif, catégorie image uniquement. "normal" (par défaut, 150 DPI) ou "high" (300 DPI). |
Conversions courantes
Une référence rapide pour les paires les plus courantes — le même point de terminaison les gère toutes, avec simplement une combinaison category/target différente.
| 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 |
Réponse
En cas de succès (200) : les octets bruts du fichier converti, avec les en-têtes Content-Type et Content-Disposition renseignés en conséquence. En cas d’échec : un corps JSON de la forme {"error": {"code": "...", "message": "..."}} avec un code de statut HTTP correspondant — voir Erreurs ci-dessous.
| Header | Value |
|---|---|
Content-Type | Le vrai type MIME du fichier converti (par ex. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — un nom de fichier suggéré, comme pour tout téléchargement de fichier. |
Content-Length | Taille du corps de la réponse, en octets. |
Compression
Réduisez la taille d’un fichier sans en changer le format — même format en entrée, même format en sortie. Une paire de catégories distincte de la conversion, image-compress et document-compress, chacune avec ses propres options ci-dessous.
image-compress
Même format en entrée, même format en sortie (JPG/PNG/WEBP/GIF) — target_percent indique la taille visée du résultat par rapport à l’original, ce n’est pas un réglage de qualité fixe.
| Field | Description |
|---|---|
category | À définir sur "image-compress". |
target_percent | Facultatif, de 1 à 100 (60 par défaut). Taille cible, en pourcentage approximatif de l’original — plus le nombre est petit, plus la compression est forte. |
file | Obligatoire. 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 en entrée, PDF en sortie, via la recompression propre à Ghostscript — ne renvoie jamais un fichier plus volumineux que celui envoyé (l’original est renvoyé tel quel si la recompression n’a pas aidé).
| Field | Description |
|---|---|
category | À définir sur "document-compress". |
level | Facultatif : "low", "medium" (par défaut), "high" ou "none". Une compression plus forte sacrifie davantage de qualité visuelle, surtout sur les images/scans intégrés. |
grayscale | Facultatif. "1" pour convertir aussi en niveaux de gris ; à omettre pour conserver la couleur. |
file | Obligatoire. Un PDF non ouvert/protégé par mot de passe (utilisez d’abord Déverrouiller un PDF sur le site si c’est le cas). |
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 taille du fichier envoyé, en octets, avant compression. |
X-Saved-Percent | Environ de combien le résultat est plus petit que l’original, en pourcentage arrondi à l’entier (peut être 0). |
Vidéo et audio (asynchrone)
Les conversions vidéo et audio peuvent durer plusieurs minutes, trop longtemps pour maintenir ouverte une seule requête synchrone — celles-ci utilisent donc un flux d’envoi puis d’interrogation plutôt que le point de terminaison ci-dessus. Envoyez un fichier, récupérez immédiatement un job_id, puis interrogez son statut jusqu’à ce qu’il soit terminé.
Envoyer une tâche
Même structure de requête POST multipart que le point de terminaison principal, mais à une URL différente.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Obligatoire. "Bearer tc_live_...". |
category | « video » ou « audio ». |
target | Obligatoire — par ex. « MP4 », « MOV », « MP3 », « WAV ». |
file | Obligatoire. Le fichier à convertir (envoi multipart). |
webhook_url | Facultatif. Une URL http(s) à laquelle le résultat du job sera envoyé (POST) une fois terminé, plutôt que de simplement interroger job-status.php. Doit se résoudre à une adresse publique. |
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"
Réponse (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Interroger le statut
Interrogez cette adresse toutes les quelques secondes avec le job_id récupéré précédemment. « status » vaut 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 (facultatif)
Si vous avez fourni un webhook_url lors de l'envoi, nous POSTerons ce même corps JSON une fois le job terminé — succès ou échec — en réessayant quelques fois si votre point de terminaison ne répond pas. job-status.php reste disponible comme solution de repli.
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" }
Télécharger le résultat
Une fois le statut « completed », la réponse contient un download_url — la même URL de statut avec &download=1 ajouté. Sa requête renvoie alors les octets bruts du fichier converti, avec les mêmes en-têtes que tout autre point de terminaison de cette page. Le résultat est supprimé dès qu'il est téléchargé, ou automatiquement après une courte période de conservation s'il n'est jamais téléchargé.
scheduleLes résultats des tâches sont supprimés immédiatement après le téléchargement, ou automatiquement après une courte période de conservation s'ils ne sont jamais téléchargés — téléchargez-les rapidement.
Exemples
La même requête dans quatre langages — choisissez celui qui correspond à votre stack. Chacun convertit un fichier local photo.jpg en PNG et enregistre le résultat.
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()); } }
Erreurs
Chaque échec renvoie une enveloppe d’erreur JSON avec un "code" que votre application peut tester, ainsi qu’un "message" lisible. Certaines erreurs incluent des champs supplémentaires (quota_exceeded inclut par exemple "limit" et "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 | Aucun en-tête Authorization n’a été envoyé. |
401 invalid_key | La clé n’existe pas, ou a été révoquée. |
403 account_suspended | Le compte propriétaire de cette clé est suspendu. |
403 plan_required | Le compte est sur l’offre Free — l’accès à l’API nécessite Basic, Lite, Pro ou Team. |
400 invalid_category | "category" n’était pas "image" ni "document". |
400 missing_target | "target" était vide. |
400 no_file | Aucun fichier n’a été envoyé, ou l’envoi a échoué — le champ doit s’appeler "file". |
413 file_too_large | Le fichier dépasse la taille maximale de téléversement autorisée par votre offre. |
429 quota_exceeded | Le quota mensuel de minutes de conversion de l’offre est épuisé. Réinitialisation au début du mois calendaire suivant. |
429 concurrency_limit | Trop de conversions déjà en cours simultanément pour ce compte (partagé avec le site) — attendez qu’une conversion se termine, puis réessayez. |
400/415/422/500/503 conversion_failed | Le fichier lui-même n’a pas pu être converti — "message" en explique la raison. Le code de statut varie selon la cause : 400/415/422 signifient que le fichier ou la cible ne fonctionneront pas, peu importe le nombre de tentatives ; 500/503 signifient un problème côté serveur, et 503 en particulier mérite une brève nouvelle tentative. |
405 method_not_allowed | Mauvaise méthode HTTP — ce point de terminaison n’accepte que POST. |
400 invalid_target | « target » n’est pas un format de sortie pris en charge pour cette catégorie. |
404 job_not_found | Aucune tâche avec cet identifiant n’existe pour ce compte (également renvoyé pour le job_id d’un autre compte — son existence n’est jamais révélée). |
410 result_gone | La tâche est terminée, mais son résultat a depuis été supprimé (les résultats sont supprimés immédiatement après le téléchargement, ou automatiquement après une courte période de conservation). |
500 storage_failed | Le serveur n’a pas pu enregistrer le fichier envoyé pour un traitement en arrière-plan. Vous pouvez réessayer sans risque. |
Gérer les erreurs et les nouvelles tentatives
Basez votre logique sur le champ JSON "code", pas sur le texte de "message" — le texte peut changer, le code non. concurrency_limit mérite une brève nouvelle tentative après quelques secondes (elle se résout dès qu’une de vos conversions en cours se termine) ; quota_exceeded ne se résoudra pas avant le mois prochain, donc ne le retentez pas en boucle. conversion_failed est le seul code où le statut HTTP compte encore : un 503 est un problème serveur temporaire qui mérite une brève nouvelle tentative, tandis que 400/415/422/500 signifient que cette combinaison précise de fichier/cible ne réussira jamais, quel que soit le nombre de tentatives. Vérifier la taille d’un fichier côté client avant l’envoi évite de gaspiller une requête pour un file_too_large garanti.
Offres et limites
L’API partage ses limites avec l’offre que vous utilisez déjà sur le site — rien à configurer séparément.
Basic
bolt2000 minutes de conversion / mois
upload_fileFichiers jusqu’à 2 GB
sync_alt50 requête(s) simultanée(s)
speed30 requ\u00eates/minute
Lite
bolt3000 minutes de conversion / mois
upload_fileFichiers jusqu’à 4 GB
sync_alt100 requête(s) simultanée(s)
speed60 requ\u00eates/minute
Pro
bolt5000 minutes de conversion / mois
upload_fileFichiers jusqu’à 10 GB
sync_altRequêtes simultanées illimitées
speed120 requ\u00eates/minute
Team
bolt10000 minutes de conversion / mois
upload_fileFichiers jusqu’à 20 GB
sync_altRequêtes simultanées illimitées
speed240 requ\u00eates/minute
tollPartagé avec le pool de crédits mensuel de l’équipe, si elle en utilise un
Dès qu’une limite par minute s’applique, chaque réponse inclut les en-têtes X-RateLimit-Limit et X-RateLimit-Remaining ; une réponse 429 inclut aussi Retry-After (en secondes) — utilisez-les pour ralentir avant d’atteindre la limite plutôt que de réagir seulement après un 429.
Formats pris en charge
Exactement le même moteur de conversion que celui utilisé par le site — rien n’est exclusif à l’API ou au site.
Acceptés en source :
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Disponibles en cible :
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Acceptés en source :
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Disponibles en cible :
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Source et cible (même format en entrée, même format en sortie) :
JPG, PNG, WEBP, GIF
Source et cible (même format en entrée, même format en sortie) :
Source et cible (même format en entrée, même format en sortie) :
MP4, MOV, AVI, MKV, WEBM
Source et cible (même format en entrée, même format en sortie) :
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoLa vidéo et l’audio — conversion comme compression — restent pour l’instant réservés au site : un appel HTTP synchrone se prête mal à une tâche pouvant durer plusieurs minutes.
Questions fréquentes
Pas encore — ces conversions peuvent prendre plusieurs minutes, ce qui se prête mal à une requête HTTP synchrone unique. Elles sont disponibles dès aujourd’hui sur le site ; une prise en charge par l’API pourrait suivre s’il existe un jour une version asynchrone/à base de tâches de l’API.
L’accès à l’API nécessite Basic, Lite, Pro ou Team. Si le compte repasse à Free — résiliation, ou abonnement expiré — les clés existantes cessent de fonctionner immédiatement. Elles refonctionnent automatiquement si le compte revient à une offre payante ; il n’est pas nécessaire d’en générer une nouvelle.
Au début de chaque mois calendaire, pas à votre date de facturation.
Pas pour l’instant — chaque requête est décomptée de votre quota mensuel réel. Utilisez de petits fichiers pendant l’intégration pour le préserver.
Jusqu’à la limite de simultanéité de votre offre (voir Offres et limites ci-dessus) — partagée avec les conversions que vous lancez en même temps sur le site, ce n’est pas un quota séparé réservé à l’API.
Pour document-compress, oui — elle ne renvoie jamais un PDF plus volumineux que celui envoyé ; si la recompression de Ghostscript n’a pas aidé, vous récupérez l’original inchangé (X-Saved-Percent affichera 0). Pour image-compress, target_percent est un objectif visé par l’encodeur, pas une garantie stricte — une source déjà fortement compressée peut ne pas rétrécir beaucoup plus.
Prêt à commencer ?
Générez une clé et effectuez votre première requête en moins d’une minute.
Obtenir votre clé API