TransConvert API
Konwertuj obrazy i dokumenty programistycznie za pomocą jednego prostego endpointu HTTP.
curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
Szybki start
Od zera do pierwszego przekonwertowanego pliku w trzech krokach.
Zarejestruj się (lub przejdź na wyższy plan istniejącego konta) — Basic, Lite, Pro lub Team — a następnie wygeneruj klucz na stronie swojego konta. Możesz wrócić i wyświetlić go ponownie w dowolnym momencie.
Wyślij plik metodą POST na poniższy endpoint jako multipart/form-data, z kluczem w nagłówku Authorization oraz ustawionymi category i target.
Odpowiedź 200 to surowe bajty przekonwertowanego pliku — zapisz treść odpowiedzi bezpośrednio. Wszystko inne to błąd JSON wyjaśniający, co poszło nie tak.
Uwierzytelnianie
Każde żądanie wymaga klucza API, wysyłanego jako token Bearer w nagłówku Authorization.
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Dostępne w planach Basic, Lite, Pro i Team. Wygeneruj klucz na stronie swojego konta →
Przetestuj swój klucz
Szybki sposób, aby potwierdzić, że klucz działa, zanim napiszesz właściwy kod integracji — sam ten test niczego nie przekonwertuje (brak dołączonego pliku), ale odpowiedź 400 no_file zamiast 401 potwierdza, że sam klucz jest poprawny.
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
Endpoint
Jeden endpoint obsługuje każdą konwersję. Wyślij żądanie POST typu multipart/form-data z plikiem i poniższymi polami.
https://transconvert.com/api/v1/convert.php
Parametry
| Field | Description |
|---|---|
Authorization | Wymagane. „Bearer tc_live_...”. |
category | Wymagane. „image” lub „document” — jeśli chcesz kompresować zamiast konwertować, zobacz Kompresję poniżej. |
target | Wymagane. Kod formatu wyjściowego, np. „PNG”, „DOCX” — zobacz Obsługiwane formaty poniżej. |
file | Wymagane. Plik do konwersji (przesyłany jako multipart). |
pdf_mode | Opcjonalne, tylko dla kategorii image. „pages” (domyślnie, rasteryzuje każdą stronę) lub „extract” (wyciąga osadzone obrazy w niezmienionej postaci) — ma znaczenie tylko wtedy, gdy źródłem jest PDF. |
pdf_pages | Opcjonalne, tylko dla kategorii image. „all” (domyślnie) lub „first”. |
pdf_quality | Opcjonalne, tylko dla kategorii image. „normal” (domyślnie, 150 DPI) lub „high” (300 DPI). |
Popularne konwersje
Szybki przegląd popularnych par formatów — ten sam endpoint obsługuje je wszystkie, zmienia się tylko kombinacja 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 |
Odpowiedź
Przy sukcesie (200): surowe bajty przekonwertowanego pliku, z ustawionymi dla niego nagłówkami Content-Type i Content-Disposition. Przy niepowodzeniu: treść JSON w postaci {"error": {"code": "...", "message": "..."}} wraz z odpowiednim kodem statusu HTTP — zobacz Błędy poniżej.
| Header | Value |
|---|---|
Content-Type | Rzeczywisty typ MIME przekonwertowanego pliku (np. image/png, application/pdf). |
Content-Disposition | attachment; filename="..." — sugerowana nazwa pliku, tak jak przy każdym pobieraniu pliku. |
Content-Length | Rozmiar treści odpowiedzi w bajtach. |
Kompresja
Zmniejsz rozmiar pliku bez zmiany jego formatu — na wejściu i wyjściu ten sam format. To osobna para kategorii względem konwersji: image-compress i document-compress, każda z własnymi opcjami poniżej.
image-compress
Ten sam format na wejściu i wyjściu (JPG/PNG/WEBP/GIF) — target_percent to przybliżony rozmiar wyniku względem oryginału, do którego dążymy, a nie stały poziom jakości.
| Field | Description |
|---|---|
category | Ustaw na „image-compress”. |
target_percent | Opcjonalne, 1–100 (domyślnie 60). Docelowy rozmiar jako przybliżony procent oryginału — mniejsze liczby oznaczają mocniejszą kompresję. |
file | Wymagane. JPG, PNG, WEBP lub 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 na wejściu, PDF na wyjściu, dzięki rekompresji wbudowanej w Ghostscript — nigdy nie zwraca pliku większego niż przesłany (jeśli rekompresja nie pomogła, zwracany jest oryginał).
| Field | Description |
|---|---|
category | Ustaw na „document-compress”. |
level | Opcjonalne: „low”, „medium” (domyślnie), „high” lub „none”. Wyższa kompresja oznacza większy spadek jakości wizualnej, głównie w osadzonych obrazach/skanach. |
grayscale | Opcjonalne. „1”, aby dodatkowo skonwertować do skali szarości; pomiń, aby zachować pełny kolor. |
file | Wymagane. Plik PDF, który nie jest otwarty ani zabezpieczony hasłem (jeśli jest, najpierw użyj narzędzia Odblokuj PDF na stronie). |
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 | Rozmiar przesłanego pliku w bajtach, przed kompresją. |
X-Saved-Percent | W przybliżeniu o ile mniejszy jest wynik od oryginału, jako pełna liczba procent (może wynosić 0). |
Wideo i audio (asynchronicznie)
Konwersje wideo i audio mogą trwać kilka minut — zbyt długo, by utrzymywać jedno synchroniczne żądanie — dlatego zamiast powyższego endpointu korzystają z modelu wyślij-i-odpytuj. Prześlij plik, od razu otrzymaj job_id, a następnie odpytuj o jego status, aż będzie gotowy.
Prześlij zadanie
Taki sam kształt żądania POST typu multipart jak w głównym endpoincie, tylko pod innym adresem URL.
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | Wymagane. „Bearer tc_live_...”. |
category | „video” lub „audio”. |
target | Wymagane — np. „MP4”, „MOV”, „MP3”, „WAV”. |
file | Wymagane. Plik do konwersji (przesyłany jako multipart). |
webhook_url | Opcjonalne. Adres URL http(s), na który zostanie wysłany (POST) wynik zadania po jego zakończeniu, zamiast tylko odpytywania job-status.php. Musi wskazywać na publiczny adres. |
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"
Odpowiedź (202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
Odpytuj o status
Odpytuj co kilka sekund, używając otrzymanego job_id. „status” przyjmuje jedną z wartości: queued, processing, completed lub 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"
}
Webhooki (opcjonalnie)
Jeśli podano webhook_url podczas przesyłania, po zakończeniu zadania — sukcesem lub niepowodzeniem — wyślemy tam ten sam JSON, ponawiając próbę kilka razy, jeśli Twój endpoint nie odpowiada. job-status.php nadal działa jako zapasowe rozwiązanie.
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" }
Pobierz wynik
Gdy status to „completed”, odpowiedź zawiera download_url — ten sam adres URL statusu z dopisanym &download=1. Zażądanie go strumieniuje surowe bajty przekonwertowanego pliku, z takimi samymi nagłówkami jak każdy inny endpoint na tej stronie. Wynik jest usuwany w momencie pobrania, a jeśli nigdy nie zostanie pobrany — automatycznie po krótkim okresie przechowywania.
scheduleWyniki zadań są usuwane natychmiast po pobraniu, a jeśli nigdy nie zostaną pobrane — automatycznie po krótkim okresie przechowywania — pobierz je bez zwłoki.
Przykłady
To samo żądanie w czterech językach — wybierz ten, który pasuje do Twojego stosu technologicznego. Każdy przykład konwertuje lokalny plik photo.jpg do PNG i zapisuje wynik.
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()); } }
Błędy
Każde niepowodzenie zwraca kopertę błędu JSON z polem „code”, po którym Twój kod może rozgałęziać logikę, oraz czytelnym dla człowieka polem „message”. Niektóre błędy zawierają dodatkowe pola (na przykład quota_exceeded zawiera „limit” i „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 | Nie wysłano nagłówka Authorization. |
401 invalid_key | Klucz nie istnieje lub został unieważniony. |
403 account_suspended | Konto, do którego należy ten klucz, zostało zawieszone. |
403 plan_required | Konto jest w planie Free — dostęp do API wymaga planu Basic, Lite, Pro lub Team. |
400 invalid_category | Pole „category” nie miało wartości „image” ani „document”. |
400 missing_target | Pole „target” było puste. |
400 no_file | Nie wysłano żadnego pliku albo przesyłanie się nie powiodło — pole musi nazywać się „file”. |
413 file_too_large | Plik przekracza maksymalny rozmiar przesyłania dla Twojego planu. |
429 quota_exceeded | Miesięczny limit minut konwersji w tym planie został wyczerpany. Odnawia się na początku kolejnego miesiąca kalendarzowego. |
429 concurrency_limit | Zbyt wiele konwersji uruchomionych jednocześnie dla tego konta (limit współdzielony ze stroną) — poczekaj, aż jedna się zakończy, i spróbuj ponownie. |
400/415/422/500/503 conversion_failed | Samego pliku nie udało się przekonwertować — powód wyjaśnia pole „message”. Kod statusu zależy od przyczyny: 400/415/422 oznaczają, że plik lub format docelowy nie zadziałają niezależnie od liczby prób; 500/503 oznaczają problem po stronie serwera, a 503 w szczególności warto krótko ponowić. |
405 method_not_allowed | Niewłaściwa metoda HTTP — ten endpoint akceptuje tylko POST. |
400 invalid_target | „target” nie jest obsługiwanym formatem wyjściowym dla tej kategorii. |
404 job_not_found | Nie istnieje zadanie o tym identyfikatorze na tym koncie (zwracane też dla job_id innego konta — jego istnienie nigdy nie jest ujawniane). |
410 result_gone | Zadanie zostało ukończone, ale jego wynik został już usunięty (wyniki są usuwane natychmiast po pobraniu lub automatycznie po krótkim okresie przechowywania). |
500 storage_failed | Serwer nie mógł zapisać przesłanego pliku do przetwarzania w tle. Można bezpiecznie ponowić próbę. |
Obsługa błędów i ponawianie prób
Rozgałęziaj logikę na podstawie pola JSON „code”, a nie tekstu „message” — treść komunikatu może się zmieniać, kod nie. concurrency_limit warto krótko ponowić po kilku sekundach (znika, gdy tylko zakończy się jedna z Twoich trwających konwersji); quota_exceeded nie rozwiąże się samo aż do następnego miesiąca, więc nie ponawiaj go w pętli. conversion_failed to jedyny kod, przy którym nadal liczy się status HTTP: 503 to przejściowy problem po stronie serwera, warty jednej krótkiej ponownej próby, natomiast 400/415/422/500 oznaczają, że ta konkretna kombinacja pliku i formatu docelowego nie powiedzie się niezależnie od liczby ponownych prób. Sprawdzenie rozmiaru pliku po stronie klienta przed przesłaniem pozwala uniknąć marnowania żądania na gwarantowany file_too_large.
Plany i limity
API współdzieli limity z tym samym planem, którego już używasz na stronie — nie ma nic osobnego do skonfigurowania.
Basic
bolt2000 minut konwersji / miesiąc
upload_filePliki do 2 GB
sync_alt50 żądanie(a) jednocześnie
speed30 żądań/minutę
Lite
bolt3000 minut konwersji / miesiąc
upload_filePliki do 4 GB
sync_alt100 żądanie(a) jednocześnie
speed60 żądań/minutę
Pro
bolt5000 minut konwersji / miesiąc
upload_filePliki do 10 GB
sync_altNielimitowana liczba żądań jednocześnie
speed120 żądań/minutę
Team
bolt10000 minut konwersji / miesiąc
upload_filePliki do 20 GB
sync_altNielimitowana liczba żądań jednocześnie
speed240 żądań/minutę
tollWspółdzielone z miesięczną pulą kredytów zespołu, jeśli z niej korzysta
Gdy obowiązuje limit na minutę, każda odpowiedź zawiera nagłówki X-RateLimit-Limit i X-RateLimit-Remaining; odpowiedź 429 zawiera również Retry-After (w sekundach) — użyj ich, aby zwolnić tempo, zanim osiągniesz limit, zamiast reagować dopiero po 429.
Obsługiwane formaty
Dokładnie ten sam silnik konwersji, którego używa strona — nic nie jest zarezerwowane wyłącznie dla API ani wyłącznie dla strony.
Akceptowane jako źródło:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
Dostępne jako format docelowy:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
Akceptowane jako źródło:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
Dostępne jako format docelowy:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
Źródło i format docelowy (ten sam format na wejściu i wyjściu):
JPG, PNG, WEBP, GIF
Źródło i format docelowy (ten sam format na wejściu i wyjściu):
Źródło i format docelowy (ten sam format na wejściu i wyjściu):
MP4, MOV, AVI, MKV, WEBM
Źródło i format docelowy (ten sam format na wejściu i wyjściu):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
infoWideo i audio — zarówno konwersja, jak i kompresja — są na razie dostępne tylko na stronie: synchroniczne żądanie HTTP słabo pasuje do zadania, które może trwać kilka minut.
Najczęściej zadawane pytania
Jeszcze nie — te konwersje mogą trwać kilka minut, co słabo pasuje do pojedynczego synchronicznego żądania HTTP. Są dziś dostępne na stronie; wsparcie w API może pojawić się, jeśli kiedyś powstanie asynchroniczna, oparta na zadaniach wersja API.
Dostęp do API wymaga planu Basic, Lite, Pro lub Team. Jeśli konto przejdzie na Free — przez anulowanie lub wygaśnięcie subskrypcji — istniejące klucze natychmiast przestają działać. Zaczynają działać ponownie automatycznie, gdy konto wróci do planu płatnego; nie musisz generować nowego klucza.
Na początku każdego miesiąca kalendarzowego, nie w dniu rozliczenia.
Nie na razie — każde żądanie liczy się do Twojego rzeczywistego miesięcznego limitu. Podczas integracji używaj małych plików, aby go oszczędzać.
Do limitu jednoczesnych żądań Twojego planu (zobacz Plany i limity powyżej) — współdzielonego z konwersjami, które jednocześnie uruchamiasz na stronie, a nie osobnej puli tylko dla API.
Dla document-compress — tak, nigdy nie zwraca pliku PDF większego niż przesłany; jeśli rekompresja w Ghostscript nie pomogła, otrzymujesz z powrotem niezmieniony oryginał (X-Saved-Percent pokaże 0). Dla image-compress parametr target_percent jest wartością docelową, do której dąży enkoder, a nie twardą gwarancją — źródło już mocno skompresowane może nie zmniejszyć się dużo bardziej.
Gotowy, aby zacząć?
Wygeneruj klucz i wykonaj swoje pierwsze żądanie w niecałą minutę.
Pobierz swój klucz API