TransConvert API
Konvertieren Sie Bilder und Dokumente programmgesteuert über einen einzigen, einfachen HTTP-Endpunkt.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Schnellstart
In drei Schritten von null zu Ihrer ersten konvertierten Datei.
Registrieren Sie sich (oder upgraden Sie ein bestehendes Konto) auf Basic, Lite, Pro oder Team und erstellen Sie dann einen Schlüssel auf Ihrer Kontoseite – Sie können ihn dort jederzeit erneut ansehen.
Senden Sie Ihre Datei per POST als multipart/form-data an den unten stehenden Endpunkt, mit Ihrem Schlüssel im Authorization-Header sowie gesetztem category und target.
Eine 200-Antwort besteht aus den Rohbytes der konvertierten Datei – speichern Sie den Antwortkörper direkt. Alles andere ist ein JSON-Fehler, der erklärt, was schiefgelaufen ist.
Authentifizierung
Jede Anfrage benötigt einen API-Schlüssel, der als Bearer-Token im Authorization-Header gesendet wird.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Verfügbar in den Plänen Basic, Lite, Pro und Team. Schlüssel in Ihrem Konto erstellen →
Schlüssel testen
Eine schnelle Möglichkeit, zu prüfen, ob ein Schlüssel funktioniert, bevor Sie echten Integrationscode schreiben – dies allein konvertiert nichts (keine Datei angehängt), aber ein 400 no_file statt eines 401 bestätigt, dass der Schlüssel selbst gültig ist.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
Der Endpunkt
Ein einzelner Endpunkt verarbeitet jede Konvertierung. Senden Sie eine multipart/form-data-POST-Anfrage mit Ihrer Datei und den unten stehenden Feldern.
https://transconvert.com/api/v1/convert.php
Parameter
| Field | Description |
|---|---|
Authorization | Erforderlich. „Bearer tc_live_...". |
category | Erforderlich. „image" oder „document" – zum Komprimieren statt Konvertieren siehe „Compress" weiter unten. |
target | Erforderlich. Der Ausgabeformat-Code, z. B. „PNG", „DOCX" – siehe „Unterstützte Formate" weiter unten. |
file | Erforderlich. Die zu konvertierende Datei (multipart-Upload). |
pdf_mode | Optional, nur Kategorie „image". „pages" (Standard, rastert jede Seite) oder „extract" (extrahiert eingebettete Bilder unverändert) – nur relevant, wenn die Quelle eine PDF-Datei ist. |
pdf_pages | Optional, nur Kategorie „image". „all" (Standard) oder „first". |
pdf_quality | Optional, nur Kategorie „image". „normal" (Standard, 150 DPI) oder „high" (300 DPI). |
Häufige Konvertierungen
Eine schnelle Übersicht beliebter Paare – derselbe Endpunkt verarbeitet sie alle, nur mit einer anderen category/target-Kombination.
| 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 |
Antwort
Bei Erfolg (200): die Rohbytes der konvertierten Datei, mit entsprechend gesetzten Content-Type- und Content-Disposition-Headern. Bei einem Fehler: ein JSON-Body der Form {"error": {"code": "...", "message": "..."}} mit passendem HTTP-Statuscode – siehe „Fehler" weiter unten.
| Header | Value |
|---|---|
Content-Type | Der tatsächliche MIME-Typ der konvertierten Datei (z. B. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." – ein vorgeschlagener Dateiname, wie bei jedem Datei-Download. |
Content-Length | Größe des Antwortkörpers in Bytes. |
Komprimieren
Verkleinert eine Datei, ohne ihr Format zu ändern – gleiches Format rein, gleiches Format raus. Eine eigene Gruppe von Kategorien getrennt von der Konvertierung, image-compress und document-compress, jede mit eigenen Optionen weiter unten.
image-compress
Gleiches Format rein, gleiches Format raus (JPG/PNG/WEBP/GIF) – target_percent gibt an, wie klein das Ergebnis im Verhältnis zum Original ungefähr sein soll, keine feste Qualitätseinstellung.
| Field | Description |
|---|---|
category | Auf „image-compress" setzen. |
target_percent | Optional, 1–100 (Standard 60). Zielgröße als ungefährer Prozentsatz des Originals – kleinere Zahlen komprimieren stärker. |
file | Erforderlich. JPG, PNG, WEBP oder 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 rein, PDF raus, mittels Ghostscripts eigener Rekomprimierung – liefert nie eine größere Datei als die hochgeladene zurück (fällt auf das Original zurück, falls die Rekomprimierung nichts gebracht hat).
| Field | Description |
|---|---|
category | Auf „document-compress" setzen. |
level | Optional: „low", „medium" (Standard), „high" oder „none". Höhere Komprimierung geht auf Kosten der visuellen Qualität, vor allem bei eingebetteten Bildern/Scans. |
grayscale | Optional. „1", um zusätzlich in Graustufen umzuwandeln; weglassen für Vollfarbe. |
file | Erforderlich. Eine PDF-Datei, die weder geöffnet noch passwortgeschützt ist (verwenden Sie andernfalls zuerst „PDF entsperren" auf der 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 | Die Größe der hochgeladenen Datei in Bytes, vor der Komprimierung. |
X-Saved-Percent | Ungefähr, um wie viel kleiner das Ergebnis als das Original ist, als ganzzahliger Prozentsatz (kann 0 sein). |
Video & Audio (asynchron)
Video- und Audiokonvertierungen können mehrere Minuten dauern — zu lange, um eine einzelne synchrone Anfrage offen zu halten. Dafür wird statt des obigen Endpunkts ein Submit-dann-Poll-Ablauf verwendet: Sie senden eine Datei, erhalten sofort eine job_id zurück und fragen dann deren Status ab, bis der Vorgang abgeschlossen ist.
Auftrag einreichen
Dieselbe Multipart-POST-Struktur wie beim Haupt-Endpunkt, nur unter einer anderen URL.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Erforderlich. „Bearer tc_live_...". |
category | „video" oder „audio". |
target | Erforderlich — z. B. „MP4", „MOV", „MP3", „WAV". |
file | Erforderlich. Die zu konvertierende Datei (multipart-Upload). |
webhook_url | Optional. Eine http(s)-URL, an die das Jobergebnis per POST gesendet wird, sobald es fertig ist – statt nur job-status.php abzufragen. Muss auf eine öffentliche Adresse auflösen. |
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"
Antwort (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Status abfragen
Fragen Sie diesen Endpunkt alle paar Sekunden mit der erhaltenen job_id ab. „status" ist einer von queued, processing, completed oder 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 (optional)
Wenn Sie bei der Übermittlung eine webhook_url angegeben haben, senden wir denselben JSON-Body einmal per POST dorthin, sobald der Job fertig ist – bei Erfolg oder Fehlschlag – und versuchen es bei fehlender Antwort einige Male erneut. job-status.php funktioniert weiterhin als Fallback.
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" }
Ergebnis herunterladen
Sobald der Status „completed" ist, enthält die Antwort eine download_url — dieselbe Status-URL mit angehängtem &download=1. Ruft man sie auf, werden die Rohdaten der konvertierten Datei gestreamt, mit denselben Headern wie bei jedem anderen Endpunkt auf dieser Seite. Das Ergebnis wird in dem Moment gelöscht, in dem es heruntergeladen wird, oder automatisch nach einem kurzen Aufbewahrungszeitraum, falls es nie heruntergeladen wird.
scheduleAuftragsergebnisse werden sofort nach dem Herunterladen gelöscht oder automatisch nach einem kurzen Aufbewahrungszeitraum, falls sie nie heruntergeladen werden — laden Sie sie zeitnah herunter.
Beispiele
Dieselbe Anfrage in vier Sprachen – wählen Sie die, die zu Ihrem Stack passt. Jedes Beispiel konvertiert eine lokale photo.jpg in PNG und speichert das Ergebnis.
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()); } }
Fehler
Jeder Fehler liefert einen JSON-Fehlerumschlag mit einem „code", anhand dessen Ihr Code Fallunterscheidungen treffen kann, sowie einer lesbaren „message". Manche Fehler enthalten zusätzliche Felder (quota_exceeded enthält beispielsweise „limit" und „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 | Es wurde kein Authorization-Header gesendet. |
401 invalid_key | Der Schlüssel existiert nicht oder wurde widerrufen. |
403 account_suspended | Das Konto, dem dieser Schlüssel gehört, ist gesperrt. |
403 plan_required | Das Konto nutzt den kostenlosen Plan – für API-Zugriff ist Basic, Lite, Pro oder Team erforderlich. |
400 invalid_category | „category" war weder „image" noch „document". |
400 missing_target | „target" war leer. |
400 no_file | Es wurde keine Datei gesendet, oder der Upload ist fehlgeschlagen – das Feld muss „file" heißen. |
413 file_too_large | Die Datei überschreitet die maximale Upload-Größe Ihres Plans. |
429 quota_exceeded | Das monatliche Kontingent an Umwandlungsminuten des Plans ist aufgebraucht. Es wird zu Beginn des nächsten Kalendermonats zurückgesetzt. |
429 concurrency_limit | Für dieses Konto laufen bereits zu viele Konvertierungen gleichzeitig (gemeinsam mit der Website genutzt) – warten Sie, bis eine davon abgeschlossen ist, und versuchen Sie es erneut. |
400/415/422/500/503 conversion_failed | Die Datei selbst konnte nicht konvertiert werden – „message" erklärt den Grund. Der Statuscode hängt vom Grund ab: 400/415/422 bedeuten, dass die Datei oder das Zielformat unabhängig von der Anzahl der Versuche nicht funktionieren wird; 500/503 bedeuten ein serverseitiges Problem, wobei sich bei 503 insbesondere ein kurzer erneuter Versuch lohnt. |
405 method_not_allowed | Falsche HTTP-Methode – dieser Endpunkt akzeptiert nur POST. |
400 invalid_target | „target" ist kein unterstütztes Ausgabeformat für diese Kategorie. |
404 job_not_found | Für dieses Konto existiert kein Auftrag mit dieser ID (wird auch für die job_id eines anderen Kontos zurückgegeben — deren Existenz wird nie preisgegeben). |
410 result_gone | Der Auftrag wurde abgeschlossen, aber sein Ergebnis wurde inzwischen gelöscht (Ergebnisse werden sofort nach dem Herunterladen oder automatisch nach einem kurzen Aufbewahrungszeitraum entfernt). |
500 storage_failed | Der Server konnte den Upload nicht für die Hintergrundverarbeitung speichern. Ein erneuter Versuch ist unbedenklich. |
Umgang mit Fehlern & erneuten Versuchen
Orientieren Sie sich am „code"-Feld des JSON, nicht am „message"-Text – der Wortlaut kann sich ändern, der Code nicht. Bei concurrency_limit lohnt sich ein kurzer erneuter Versuch nach ein paar Sekunden (er verschwindet, sobald eine Ihrer laufenden Konvertierungen abgeschlossen ist); quota_exceeded löst sich erst im nächsten Monat von selbst, versuchen Sie es also nicht in einer Schleife erneut. conversion_failed ist der einzige Code, bei dem der HTTP-Statuscode weiterhin wichtig ist: Ein 503 ist ein vorübergehendes serverseitiges Problem, bei dem sich ein kurzer erneuter Versuch lohnt, während 400/415/422/500 bedeuten, dass genau diese Kombination aus Datei und Zielformat unabhängig von der Anzahl der Versuche nicht gelingen wird. Die Dateigröße clientseitig vor dem Hochladen zu prüfen, erspart eine Anfrage, die garantiert zu file_too_large führt.
Pläne & Limits
Die API teilt sich ihre Limits mit dem Plan, den Sie bereits auf der Website nutzen – nichts Separates zu konfigurieren.
Basic
bolt2000 Umwandlungsminuten/Monat
upload_fileDateien bis zu 2 GB
sync_alt50 Anfrage(n) gleichzeitig
speed30 Anfragen/Minute
Lite
bolt3000 Umwandlungsminuten/Monat
upload_fileDateien bis zu 4 GB
sync_alt100 Anfrage(n) gleichzeitig
speed60 Anfragen/Minute
Pro
bolt5000 Umwandlungsminuten/Monat
upload_fileDateien bis zu 10 GB
sync_altUnbegrenzt viele Anfragen gleichzeitig
speed120 Anfragen/Minute
Team
bolt10000 Umwandlungsminuten/Monat
upload_fileDateien bis zu 20 GB
sync_altUnbegrenzt viele Anfragen gleichzeitig
speed240 Anfragen/Minute
tollGemeinsam mit dem monatlichen Guthaben-Pool des Teams genutzt, sofern dieses einen verwendet
Sobald ein Minutenlimit gilt, enthält jede Antwort die Header X-RateLimit-Limit und X-RateLimit-Remaining; eine 429-Antwort enthält zusätzlich Retry-After (in Sekunden) — nutzen Sie diese, um rechtzeitig zu drosseln, statt erst auf einen 429 zu reagieren.
Unterstützte Formate
Genau dieselbe Konvertierungs-Engine, die auch die Website nutzt – nichts ist nur der API oder nur der Website vorbehalten.
Als Quelle akzeptiert:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Als Ziel verfügbar:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Als Quelle akzeptiert:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Als Ziel verfügbar:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Quelle und Ziel (gleiches Format rein, gleiches Format raus):
JPG, PNG, WEBP, GIF
Quelle und Ziel (gleiches Format rein, gleiches Format raus):
Quelle und Ziel (gleiches Format rein, gleiches Format raus):
MP4, MOV, AVI, MKV, WEBM
Quelle und Ziel (gleiches Format rein, gleiches Format raus):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoVideo und Audio – sowohl Konvertieren als auch Komprimieren – sind derzeit nur über die Website verfügbar: Ein synchroner HTTP-Aufruf eignet sich schlecht für einen Vorgang, der mehrere Minuten dauern kann.
Häufig gestellte Fragen
Noch nicht – diese Konvertierungen können mehrere Minuten dauern, was sich schlecht mit einer einzelnen synchronen HTTP-Anfrage verträgt. Sie sind bereits heute auf der Website verfügbar; API-Unterstützung könnte folgen, falls es einmal eine asynchrone, jobbasierte Version der API gibt.
API-Zugriff erfordert Basic, Lite, Pro oder Team. Wechselt das Konto zu Free – durch Kündigung oder ein auslaufendes Abonnement –, funktionieren bestehende Schlüssel sofort nicht mehr. Sie funktionieren automatisch wieder, sobald das Konto erneut einen kostenpflichtigen Plan hat; Sie müssen keinen neuen erstellen.
Zu Beginn jedes Kalendermonats, nicht an Ihrem Abrechnungsdatum.
Derzeit nicht – jede Anfrage zählt auf Ihr reales monatliches Kontingent. Verwenden Sie beim Integrieren kleine Dateien, um es zu schonen.
Bis zum Nebenläufigkeitslimit Ihres Plans (siehe „Pläne & Limits" oben) – gemeinsam genutzt mit Konvertierungen, die Sie gleichzeitig auch auf der Website ausführen, kein separates, nur für die API geltendes Kontingent.
Bei document-compress ja – es wird nie eine größere PDF-Datei zurückgegeben als die hochgeladene; falls Ghostscripts Rekomprimierung nichts gebracht hat, erhalten Sie das unveränderte Original zurück (X-Saved-Percent zeigt dann 0). Bei image-compress ist target_percent ein Zielwert, den der Encoder anstrebt, keine feste Garantie – eine bereits stark komprimierte Quelldatei lässt sich möglicherweise nicht viel weiter verkleinern.
Bereit loszulegen?
Erstellen Sie einen Schlüssel und senden Sie Ihre erste Anfrage in unter einer Minute.
API-Schlüssel abrufen