curl -X POST \ .../api/v1/convert.php \ -H "Authorization: Bearer ..." \ -F "category=image" \ -F "target=PNG" \ -F "file=@photo.jpg" \ -o converted.png
クイックスタート
3つのステップで、最初のファイル変換までを完了できます。
Basic、Lite、Pro、Teamのいずれかに登録(または既存アカウントをアップグレード)し、アカウントページでキーを発行します — キーはいつでも後から確認できます。
Authorizationヘッダーにキーを設定し、category と target を指定したうえで、ファイルをmultipart/form-data形式で下記のエンドポイントにPOSTします。
200が返された場合は変換後のファイルの生バイト列なので、レスポンスボディをそのまま保存してください。それ以外の場合は、内容を説明するJSONエラーが返されます。
認証
すべてのリクエストには、Authorizationヘッダーにベアラートークンとして送信するAPIキーが必要です。
Authorization: Bearer tc_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Basic、Lite、Pro、Teamの各プランでご利用いただけます。 アカウントページでキーを発行 →
キーをテストする
実際の連携コードを書く前に、キーが有効かどうかを手早く確認する方法です — これだけではファイルを添付していないため何も変換されませんが、401ではなく400 no_fileが返れば、キー自体は有効であることが確認できます。
curl -X POST -H "Authorization: Bearer tc_live_your_key_here" -F "category=image" https://transconvert.com/api/v1/convert.php
エンドポイント
すべての変換は1つのエンドポイントで処理します。ファイルと以下のフィールドを含めて、multipart/form-data形式でPOSTリクエストを送信してください。
https://transconvert.com/api/v1/convert.php
パラメーター
| Field | Description |
|---|---|
Authorization | 必須。"Bearer tc_live_..."。 |
category | 必須。"image" または "document"。変換ではなく圧縮を行う場合は、下記の「圧縮」を参照してください。 |
target | 必須。出力フォーマットのコード(例:"PNG"、"DOCX")。下記の「対応フォーマット」を参照してください。 |
file | 必須。変換するファイル(マルチパートアップロード)。 |
pdf_mode | 任意。imageカテゴリのみ。"pages"(既定。各ページを画像化)または "extract"(埋め込み画像をそのまま抽出)。変換元がPDFの場合のみ有効です。 |
pdf_pages | 任意。imageカテゴリのみ。"all"(既定)または "first"。 |
pdf_quality | 任意。imageカテゴリのみ。"normal"(既定。150DPI)または "high"(300DPI)。 |
よく使われる変換
よく使われる変換の組み合わせの早見表です — どれも同じエンドポイントで、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 |
レスポンス
成功時(200):変換後のファイルの生バイト列を、対応するContent-TypeおよびContent-Dispositionヘッダーとともに返します。失敗時:{"error": {"code": "...", "message": "..."}} という形のJSONボディを、対応するHTTPステータスコードとともに返します。詳細は下記の「エラー」を参照してください。
| Header | Value |
|---|---|
Content-Type | 変換後のファイルの実際のMIMEタイプです(例:image/png、application/pdf)。 |
Content-Disposition | 通常のファイルダウンロードと同様、attachment; filename="..." という形で推奨ファイル名が示されます。 |
Content-Length | レスポンスボディのサイズ(バイト単位)です。 |
圧縮
フォーマットを変えずにファイルを縮小します — 入力と出力は同じフォーマットです。変換とは別に image-compress と document-compress という2つのカテゴリがあり、それぞれ下記の専用オプションを持ちます。
image-compress
入力と出力は同じフォーマット(JPG/PNG/WEBP/GIF)です。target_percent は固定の画質設定ではなく、元のファイルに対してどの程度小さくすることを目標とするかを指定します。
| Field | Description |
|---|---|
category | "image-compress" を指定します。 |
target_percent | 任意。1〜100(既定60)。元のファイルに対するおおよその目標サイズをパーセントで指定します — 数値が小さいほど強く圧縮されます。 |
file | 必須。JPG、PNG、WEBP、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で、Ghostscriptによる再圧縮を行います — アップロード時より大きいファイルが返されることはありません(再圧縮で改善しない場合は元のファイルをそのまま返します)。
| Field | Description |
|---|---|
category | "document-compress" を指定します。 |
level | 任意。"low"、"medium"(既定)、"high"、"none" のいずれか。圧縮を強めるほど、主に埋め込み画像やスキャン部分の画質が低下します。 |
grayscale | 任意。グレースケールにも変換する場合は "1" を指定します。省略するとフルカラーのままになります。 |
file | 必須。開封パスワードで保護されていないPDF(保護されている場合は、先にウェブサイトの「PDFのロック解除」を使用してください)。 |
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 | 圧縮前の、アップロードされたファイルのサイズ(バイト単位)です。 |
X-Saved-Percent | 元のファイルと比べてどの程度小さくなったかを、整数のパーセントでおおよそ示します(0になる場合もあります)。 |
動画・音声(非同期)
動画や音声の変換には数分かかることがあり、1つの同期リクエストを開いたままにするには長すぎます — そのため上記のエンドポイントとは異なり、送信してからポーリングする方式を使います。ファイルを送信するとすぐにjob_idが返されるので、完了するまでそのステータスをポーリングしてください。
ジョブを送信する
メインのエンドポイントと同じmultipart POST形式ですが、URLが異なります。
https://transconvert.com/api/v1/convert-async.php
| Field | Description |
|---|---|
Authorization | 必須。"Bearer tc_live_..."。 |
category | 「video」または「audio」。 |
target | 必須 — 例:「MP4」「MOV」「MP3」「WAV」。 |
file | 必須。変換するファイル(マルチパートアップロード)。 |
webhook_url | オプション。ジョブが完了したときに、job-status.php をポーリングする代わりに結果を POST する http(s) URL。パブリックなアドレスに解決される必要があります。 |
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"
レスポンス(202 Accepted)
{ "job_id": "job_242e1555d78d166807aa56502f15d118", "status": "queued" }
ステータスをポーリングする
取得したjob_idを使って、数秒ごとにこのエンドポイントをポーリングしてください。「status」はqueued、processing、completed、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(オプション)
送信時に webhook_url を指定した場合、ジョブが完了した時点(成功・失敗いずれも)で同じ JSON ボディを一度そこに POST します。エンドポイントが応答しない場合は数回再試行します。いずれにせよ job-status.php は引き続きフォールバックとして利用できます。
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" }
結果をダウンロードする
ステータスが「completed」になると、レスポンスにdownload_urlが含まれます — これは同じステータスURLに&download=1を付加したものです。このURLをリクエストすると、このページの他のエンドポイントと同じヘッダーで変換済みファイルの生データがストリーミングされます。結果はダウンロードされた時点で削除されるか、一度もダウンロードされなかった場合は短い保持期間の後に自動的に削除されます。
scheduleジョブの結果はダウンロード後すぐに削除されるか、一度もダウンロードされなかった場合は短い保持期間の後に自動的に削除されます — 早めにダウンロードしてください。
サンプルコード
同じリクエストを4つの言語で示しています — お使いの環境に合わせて選んでください。いずれもローカルの photo.jpg をPNGに変換し、結果を保存します。
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()); } }
エラー
失敗時は必ず、プログラムで分岐に使える "code" と、人が読める "message" を含むJSONエラーが返されます。エラーによっては追加のフィールドを含むこともあります(例えば quota_exceeded には "limit" と "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 | Authorizationヘッダーが送信されませんでした。 |
401 invalid_key | キーが存在しないか、失効しています。 |
403 account_suspended | このキーを所有するアカウントは停止されています。 |
403 plan_required | アカウントがFreeプランです — API利用にはBasic、Lite、Pro、Teamのいずれかのプランが必要です。 |
400 invalid_category | "category" が "image" または "document" ではありませんでした。 |
400 missing_target | "target" が空でした。 |
400 no_file | ファイルが送信されなかったか、アップロードに失敗しました — フィールド名は "file" にする必要があります。 |
413 file_too_large | ファイルがプランの最大アップロードサイズを超えています。 |
429 quota_exceeded | プランの月間変換分の割り当てを使い切りました。翌月の初めにリセットされます。 |
429 concurrency_limit | このアカウントで同時に実行中の変換が多すぎます(ウェブサイトと共有されています) — いずれかが完了するのを待ってから再試行してください。 |
400/415/422/500/503 conversion_failed | ファイル自体を変換できませんでした — 理由は "message" に記載されています。ステータスコードは理由によって異なります: 400/415/422 は、何度再試行してもそのファイルやtargetでは成功しないことを意味します。500/503 はサーバー側の問題であり、特に503は短い間隔での再試行を試す価値があります。 |
405 method_not_allowed | HTTPメソッドが正しくありません — このエンドポイントはPOSTのみを受け付けます。 |
400 invalid_target | 「target」がそのカテゴリでサポートされている出力形式ではありません。 |
404 job_not_found | このアカウントには、そのIDのジョブが存在しません(他のアカウントのjob_idを指定した場合も同じエラーが返され、存在の有無が判別されることはありません)。 |
410 result_gone | ジョブは完了しましたが、結果はすでに削除されています(結果はダウンロード後すぐに、または一度もダウンロードされなかった場合は短い保持期間の後に自動的に削除されます)。 |
500 storage_failed | サーバーがバックグラウンド処理用にアップロードを保存できませんでした。再試行しても問題ありません。 |
エラー処理と再試行
分岐には "message" のテキストではなく、JSONの "code" フィールドを使用してください — 文言は変更される可能性がありますが、コードは変わりません。concurrency_limit は数秒待ってから再試行する価値があります(実行中の変換のいずれかが完了次第、解消します)。quota_exceeded は翌月まで解消しないため、ループで再試行しないでください。conversion_failed はHTTPステータスが引き続き重要になる唯一のコードです: 503は一時的なサーバー側の問題であり、一度だけ短い間隔で再試行する価値がありますが、400/415/422/500 は、そのファイルとtargetの組み合わせでは何度送信し直しても成功しないことを意味します。アップロード前にクライアント側でファイルサイズを確認しておくと、確実に file_too_large になるリクエストを無駄に送らずに済みます。
プランと利用上限
APIの利用上限は、ウェブサイトで使用しているのと同じプランのものがそのまま適用されます — 別途設定は不要です。
Basic
bolt2000 変換分 / 月
upload_file最大2 GBのファイル
sync_alt同時に50件のリクエスト
speed30 リクエスト/分
Lite
bolt3000 変換分 / 月
upload_file最大4 GBのファイル
sync_alt同時に100件のリクエスト
speed60 リクエスト/分
Pro
bolt5000 変換分 / 月
upload_file最大10 GBのファイル
sync_alt同時リクエスト数は無制限
speed120 リクエスト/分
Team
bolt10000 変換分 / 月
upload_file最大20 GBのファイル
sync_alt同時リクエスト数は無制限
speed240 リクエスト/分
tollチームが月間クレジットプールを使用している場合は、それと共有されます
1分あたりの上限が適用される場合、すべてのレスポンスに X-RateLimit-Limit と X-RateLimit-Remaining ヘッダーが含まれます。429 レスポンスには Retry-After(秒単位)も含まれます — 429 を受け取ってから対応するのではなく、これらを使って事前に速度を落としてください。
対応フォーマット
ウェブサイトで使用しているのとまったく同じ変換エンジンです — API限定やウェブサイト限定の機能はありません。
変換元として使用可能:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, PSD, TIFF, EPS, HEIC
変換先として使用可能:
JPG, PNG, GIF, WEBP, BMP, AVIF, PDF, ICO, PSD, TIFF, EPS
変換元として使用可能:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS, HTML
変換先として使用可能:
PDF, DOCX, DOC, PPTX, PPT, XLSX, XLS, RTF, ODT, ODP, ODS
変換元・変換先の両方(入力と出力が同じフォーマット):
JPG, PNG, WEBP, GIF
変換元・変換先の両方(入力と出力が同じフォーマット):
変換元・変換先の両方(入力と出力が同じフォーマット):
MP4, MOV, AVI, MKV, WEBM
変換元・変換先の両方(入力と出力が同じフォーマット):
MP3, WAV, OGG, AAC, FLAC, M4A, WMA, OPUS, AIFF, AMR, AU, CAF, AC3, DTS, GSM, IRCAM, MP2, TTA, VOC, W64, WV, SPX, RM
info動画・音声(変換・圧縮とも)は現時点ではウェブサイト限定です。数分かかることもある処理には、同期的なHTTPリクエストが向いていないためです。
よくある質問
まだ対応していません — これらの変換には数分かかることがあり、単発の同期的なHTTPリクエストには不向きです。現時点ではウェブサイトでご利用いただけます。将来、非同期・ジョブベースのAPIが提供されればAPIでも対応する可能性があります。
API利用にはBasic、Lite、Pro、Teamのいずれかのプランが必要です。解約やサブスクリプションの失効によりアカウントがFreeプランになると、既存のキーは直ちに機能しなくなります。アカウントが再び有料プランに戻れば自動的に機能が再開するため、新しいキーを発行し直す必要はありません。
毎月1日にリセットされます。請求日ではありません。
現在はありません — すべてのリクエストが実際の月間割り当てから消費されます。連携作業中は、割り当てを節約するために小さいファイルを使用してください。
プランの同時実行数の上限まで可能です(上記の「プランと利用上限」を参照)。この上限は、同時にウェブサイトで実行している変換とも共有されるものであり、API専用の別枠ではありません。
document-compress の場合は必ず小さくなります — アップロード時より大きいPDFが返されることはなく、Ghostscriptによる再圧縮で改善しなかった場合は元のファイルがそのまま返されます(X-Saved-Percentは0になります)。image-compress の場合、target_percent はエンコーダーが目指す目標値であり、確実な保証ではありません — すでに強く圧縮済みの画像は、それ以上あまり縮小されないことがあります。
さっそく始めましょう
キーを発行すれば、1分もかからず最初のリクエストを送信できます。
APIキーを取得