TransConvert API
Converteer afbeeldingen en documenten programmatisch via één simpel HTTP-endpoint.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Snelstart
Van nul naar je eerste geconverteerde bestand in drie stappen.
Meld je aan (of upgrade een bestaand account) naar Basic, Lite, Pro of Team, en genereer daarna een sleutel via je accountpagina — je kunt hem op elk moment opnieuw bekijken.
Stuur je bestand met POST als multipart/form-data naar het onderstaande endpoint, met je sleutel in de Authorization-header en category + target ingesteld.
Een 200-respons bevat de ruwe bytes van het geconverteerde bestand — sla de response body direct op. Al het andere is een JSON-foutmelding die uitlegt wat er misging.
Authenticatie
Voor elk verzoek is een API-sleutel vereist, verzonden als Bearer-token in de Authorization-header.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Beschikbaar bij de abonnementen Basic, Lite, Pro en Team. Genereer een sleutel via je account →
Test je sleutel
Een snelle manier om te bevestigen dat een sleutel werkt voordat je echte integratiecode schrijft — dit converteert op zichzelf niets (er is geen bestand bijgevoegd), maar een 400 no_file in plaats van een 401 bevestigt dat de sleutel zelf geldig is.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
Het endpoint
Eén enkel endpoint verwerkt elke conversie. Stuur een multipart/form-data POST-verzoek met je bestand en de onderstaande velden.
https://transconvert.com/api/v1/convert.php
Parameters
| Field | Description |
|---|---|
Authorization | Verplicht. "Bearer tc_live_...". |
category | Verplicht. "image" of "document" — voor comprimeren in plaats van converteren, zie Comprimeren hieronder. |
target | Verplicht. De code van het uitvoerformaat, bijv. "PNG", "DOCX" — zie Ondersteunde formaten hieronder. |
file | Verplicht. Het te converteren bestand (multipart-upload). |
pdf_mode | Optioneel, alleen voor categorie image. "pages" (standaard, rastert elke pagina) of "extract" (haalt ingesloten afbeeldingen ongewijzigd eruit) — alleen relevant als de bron een PDF is. |
pdf_pages | Optioneel, alleen voor categorie image. "all" (standaard) of "first". |
pdf_quality | Optioneel, alleen voor categorie image. "normal" (standaard, 150 DPI) of "high" (300 DPI). |
Veelgebruikte conversies
Een snel overzicht van populaire combinaties — hetzelfde endpoint verwerkt ze allemaal, alleen met een andere category/target-combinatie.
| 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
Bij succes (200): de ruwe bytes van het geconverteerde bestand, met bijbehorende Content-Type- en Content-Disposition-headers. Bij een fout: een JSON-body in de vorm {"error": {"code": "...", "message": "..."}} met een passende HTTP-statuscode — zie Fouten hieronder.
| Header | Value |
|---|---|
Content-Type | Het werkelijke MIME-type van het geconverteerde bestand (bijv. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — een voorgestelde bestandsnaam, net als bij elke bestandsdownload. |
Content-Length | Grootte van de response body in bytes. |
Comprimeren
Verklein een bestand zonder het formaat te wijzigen — hetzelfde formaat erin, hetzelfde formaat eruit. Een apart paar categorieën naast conversie, image-compress en document-compress, elk met hun eigen opties hieronder.
image-compress
Hetzelfde formaat erin, hetzelfde formaat eruit (JPG/PNG/WEBP/GIF) — target_percent geeft aan hoe klein het resultaat ten opzichte van het origineel moet worden, geen vaste kwaliteitsinstelling.
| Field | Description |
|---|---|
category | Stel in op "image-compress". |
target_percent | Optioneel, 1–100 (standaard 60). Doelgrootte als ruw percentage van het origineel — kleinere getallen comprimeren sterker. |
file | Verplicht. JPG, PNG, WEBP of 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 erin, PDF eruit, via Ghostscripts eigen hercompressie — levert nooit een bestand op dat groter is dan het geüploade bestand (valt terug op het origineel als hercompressie niet hielp).
| Field | Description |
|---|---|
category | Stel in op "document-compress". |
level | Optioneel: "low", "medium" (standaard), "high" of "none". Hogere compressie gaat ten koste van meer visuele kwaliteit, vooral bij ingesloten afbeeldingen/scans. |
grayscale | Optioneel. "1" om ook naar grijswaarden te converteren; laat weg voor volledige kleur. |
file | Verplicht. Een PDF die niet open-/wachtwoordbeveiligd is (gebruik anders eerst PDF Ontgrendelen op de website). |
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 | De grootte van het geüploade bestand in bytes, vóór compressie. |
X-Saved-Percent | Ruwe schatting van hoeveel kleiner het resultaat is dan het origineel, als geheel percentage (kan 0 zijn). |
Video & audio (asynchroon)
Video- en audioconversies kunnen minuten duren — te lang om één synchrone aanvraag open te houden. Deze gebruiken daarom een submit-then-poll-flow in plaats van het bovenstaande endpoint. Dien een bestand in, ontvang direct een job_id terug, en vraag daarna de status op totdat de conversie klaar is.
Een taak indienen
Dezelfde multipart POST-vorm als het hoofdendpoint, op een andere URL.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Verplicht. "Bearer tc_live_...". |
category | "video" of "audio". |
target | Verplicht — bijv. "MP4", "MOV", "MP3", "WAV". |
file | Verplicht. Het te converteren bestand (multipart-upload). |
webhook_url | Optioneel. Een http(s)-URL waarnaar het jobresultaat wordt gepost zodra het klaar is, in plaats van alleen job-status.php te pollen. Moet naar een publiek adres resolven. |
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"
Antwoord (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Status opvragen
Vraag dit elke paar seconden op met de job_id die je hebt teruggekregen. "status" is queued, processing, completed of 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 (optioneel)
Als u bij het indienen een webhook_url heeft opgegeven, posten we dezelfde JSON-body daar één keer heen zodra de job klaar is — succes of mislukking — met een paar nieuwe pogingen als uw endpoint niet reageert. job-status.php blijft sowieso als terugval werken.
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" }
Het resultaat downloaden
Zodra de status "completed" is, bevat het antwoord een download_url — dezelfde status-URL met &download=1 toegevoegd. Deze opvragen stuurt vervolgens de ruwe bytes van het geconverteerde bestand, met dezelfde headers als elk ander endpoint op deze pagina. Het resultaat wordt verwijderd zodra het is gedownload, of automatisch na een korte bewaartermijn als het nooit wordt gedownload.
scheduleTaakresultaten worden direct na het downloaden verwijderd, of automatisch na een korte bewaartermijn als ze nooit worden gedownload — download ze op tijd.
Voorbeelden
Hetzelfde verzoek in vier talen — kies wat bij jouw stack past. Elk voorbeeld converteert een lokale photo.jpg naar PNG en slaat het resultaat op.
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()); } }
Fouten
Elke fout retourneert een JSON-foutobject met een "code" waarop je code kan vertakken, plus een leesbaar "message". Sommige fouten bevatten extra velden (quota_exceeded bevat bijvoorbeeld "limit" en "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 | Er is geen Authorization-header meegestuurd. |
401 invalid_key | De sleutel bestaat niet, of is ingetrokken. |
403 account_suspended | Het account waartoe deze sleutel behoort, is geschorst. |
403 plan_required | Het account heeft het gratis abonnement — voor API-toegang is Basic, Lite, Pro of Team vereist. |
400 invalid_category | "category" was niet "image" of "document". |
400 missing_target | "target" was leeg. |
400 no_file | Er is geen bestand verzonden, of de upload is mislukt — het veld moet "file" heten. |
413 file_too_large | Het bestand overschrijdt de maximale uploadgrootte van je abonnement. |
429 quota_exceeded | De maandelijkse toewijzing conversieminuten van het abonnement is op. Wordt gereset aan het begin van de volgende kalendermaand. |
429 concurrency_limit | Er lopen al te veel conversies tegelijk voor dit account (gedeeld met de website) — wacht tot er één klaar is en probeer het opnieuw. |
400/415/422/500/503 conversion_failed | Het bestand zelf kon niet worden geconverteerd — "message" legt uit waarom. De statuscode varieert met de reden: 400/415/422 betekenen dat het bestand of target nooit zal werken, hoe vaak je het ook probeert; 500/503 duiden op een probleem aan de serverkant, en bij 503 is een korte nieuwe poging de moeite waard. |
405 method_not_allowed | Verkeerde HTTP-methode — dit endpoint accepteert alleen POST. |
400 invalid_target | "target" is geen ondersteund uitvoerformaat voor die categorie. |
404 job_not_found | Er bestaat geen taak met dat id voor dit account (dit antwoord wordt ook gegeven voor de job_id van een ander account — het bestaan ervan wordt nooit onthuld). |
410 result_gone | De taak is voltooid, maar het resultaat is inmiddels verwijderd (resultaten worden direct na het downloaden verwijderd, of automatisch na een korte bewaartermijn). |
500 storage_failed | De server kon de upload niet opslaan voor verwerking op de achtergrond. Veilig om opnieuw te proberen. |
Fouten afhandelen & opnieuw proberen
Vertak op basis van het JSON-veld "code", niet op de tekst van "message" — de formulering kan in de loop van de tijd veranderen, de code niet. Bij concurrency_limit is een korte nieuwe poging na een paar seconden de moeite waard (deze fout verdwijnt zodra een van je lopende conversies klaar is); quota_exceeded lost zichzelf pas volgende maand op, probeer het dus niet in een lus opnieuw. conversion_failed is de enige code waarbij de HTTP-status nog steeds van belang is: een 503 is een tijdelijk serverprobleem waarbij één korte nieuwe poging de moeite waard is, terwijl 400/415/422/500 betekenen dat exact die bestand/target-combinatie nooit zal slagen, hoe vaak je het ook opnieuw verstuurt. Door de bestandsgrootte vooraf aan de clientzijde te controleren, voorkom je dat je een verzoek verspilt aan een gegarandeerde file_too_large.
Abonnementen & limieten
De API deelt zijn limieten met hetzelfde abonnement dat je al op de website gebruikt — er is niets apart in te stellen.
Basic
bolt2000 conversieminuten / maand
upload_fileBestanden tot 2 GB
sync_alt50 verzoek(en) tegelijk
speed30 verzoeken/minuut
Lite
bolt3000 conversieminuten / maand
upload_fileBestanden tot 4 GB
sync_alt100 verzoek(en) tegelijk
speed60 verzoeken/minuut
Pro
bolt5000 conversieminuten / maand
upload_fileBestanden tot 10 GB
sync_altOnbeperkt aantal verzoeken tegelijk
speed120 verzoeken/minuut
Team
bolt10000 conversieminuten / maand
upload_fileBestanden tot 20 GB
sync_altOnbeperkt aantal verzoeken tegelijk
speed240 verzoeken/minuut
tollGedeeld met de maandelijkse creditpool van het team, als die er een gebruikt
Zodra een limiet per minuut geldt, bevat elk antwoord de headers X-RateLimit-Limit en X-RateLimit-Remaining; een 429-antwoord bevat ook Retry-After (in seconden) — gebruik deze om af te remmen voordat u de limiet bereikt, in plaats van pas te reageren na een 429.
Ondersteunde formaten
Exact dezelfde conversie-engine als die de website gebruikt — niets is exclusief voor de API of exclusief voor de website.
Geaccepteerd als bron:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Beschikbaar als target:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Geaccepteerd als bron:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Beschikbaar als target:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Bron en target (hetzelfde formaat erin, hetzelfde formaat eruit):
JPG, PNG, WEBP, GIF
Bron en target (hetzelfde formaat erin, hetzelfde formaat eruit):
Bron en target (hetzelfde formaat erin, hetzelfde formaat eruit):
MP4, MOV, AVI, MKV, WEBM
Bron en target (hetzelfde formaat erin, hetzelfde formaat eruit):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoVideo en audio — zowel converteren als comprimeren — zijn voorlopig alleen op de website beschikbaar: een synchrone HTTP-aanroep is niet geschikt voor een taak die enkele minuten kan duren.
Veelgestelde vragen
Nog niet — die conversies kunnen enkele minuten duren, wat niet goed past bij een enkel synchroon HTTP-verzoek. Ze zijn vandaag al beschikbaar op de website; API-ondersteuning kan volgen als er ooit een asynchrone/taakgebaseerde versie van de API komt.
API-toegang vereist Basic, Lite, Pro of Team. Als het account overgaat naar Gratis — door opzegging, of doordat een abonnement afloopt — stoppen bestaande sleutels onmiddellijk met werken. Ze werken automatisch weer zodra het account terug is op een betaald abonnement; je hoeft geen nieuwe sleutel aan te maken.
Aan het begin van elke kalendermaand, niet op je factuurdatum.
Op dit moment niet — elk verzoek telt mee voor je echte maandelijkse toewijzing. Gebruik kleine bestanden tijdens het integreren om deze te sparen.
Tot aan de gelijktijdigheidslimiet van je abonnement (zie Abonnementen & limieten hierboven) — gedeeld met eventuele conversies die je tegelijkertijd ook op de website uitvoert, geen aparte toewijzing die alleen voor de API geldt.
Voor document-compress wel — het levert nooit een PDF op die groter is dan het geüploade bestand; als Ghostscripts hercompressie niet hielp, krijg je het origineel ongewijzigd terug (X-Saved-Percent toont dan 0). Voor image-compress is target_percent een doel waar de encoder naar streeft, geen harde garantie — een bron die al zwaar gecomprimeerd is, kan mogelijk niet veel verder krimpen.
Klaar om te beginnen?
Genereer een sleutel en doe je eerste verzoek in minder dan een minuut.
Haal je API-sleutel op