APIリファレンス
ConvertFly REST APIを使うと、プログラムからファイルを変換、最適化、加工できます。ジョブとタスクで変換パイプラインを構築し、ファイルのインポート、処理、結果のエクスポートを1回のリクエストで行えます。
https://convertfly.io/api/v1すべてのエンドポイントは、このベースURLからの相対パスです。リクエストとレスポンスにはJSONを使用します。タイムスタンプはすべてUTCのISO 8601形式です。
認証
すべてのリクエストには、AuthorizationヘッダーにAPIキーを含める必要があります。キーにはcvfly_sk_という接頭辞が付いており、ダッシュボードで作成できます。
Authorization: Bearer cvfly_sk_live_abc123def456...セキュリティのヒント:APIキーをクライアント側のコードに含めないでください。環境変数に保存し、サーバーからAPIを呼び出してください。
キーのスコープ
APIキーは一部の操作に限定できます。スコープを指定せずに作成したキーには、デフォルトのスコープが付与されます。
| スコープ | アクセス |
|---|---|
| job:read | ジョブの読み取り(デフォルト) |
| job:write | ジョブとそのタスクの作成、キャンセル、再試行、削除(デフォルト) |
| task:read | タスクの読み取り(デフォルト) |
| convert | 変換の実行(デフォルト) |
| api-key:read | APIキーの一覧表示 |
| api-key:write | APIキーの作成と取り消し |
| webhook:read | Webhookの一覧表示 |
| webhook:write | Webhookの作成と削除 |
クイックスタート
PDFをDOCXに変換する手順は3つです。ジョブを作成し、完了を待ち、結果をダウンロードします。
変換ジョブを作成する
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx"
},
"export": {
"operation": "export/url",
"input": ["convert"]
}
}
}'const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_live_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
tasks: {
"import-file": {
operation: "import/url",
url: "https://example.com/report.pdf",
},
convert: {
operation: "convert",
input: ["import-file"],
output_format: "docx",
},
export: {
operation: "export/url",
input: ["convert"],
},
},
}),
});
const job = await res.json();
console.log(job.id); // "cmxr9k2p0..."
console.log(job.status); // "processing"import requests
resp = requests.post(
"https://convertfly.io/api/v1/jobs",
headers={"Authorization": "Bearer cvfly_sk_live_abc123..."},
json={
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/report.pdf",
},
"convert": {
"operation": "convert",
"input": ["import-file"],
"output_format": "docx",
},
"export": {
"operation": "export/url",
"input": ["convert"],
},
}
},
)
job = resp.json()
print(job["id"]) # "cmxr9k2p0..."
print(job["status"]) # "processing"完了を待つ
ジョブのステータスをポーリングするか、Webhookを使ってリアルタイムで通知を受け取ります。
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_live_abc123..."{
"id": "cmxr9k2p0",
"status": "finished",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{
"name": "export",
"operation": "export/url",
"status": "finished",
"result": {
"files": [
{ "url": "https://files.convertfly.io/d/cmv.../result.docx?e=...&s=..." }
]
}
}
]
}結果をダウンロードする
エクスポートタスクの結果に含まれるURLを使用します。ダウンロードリンクの有効期限は1時間で、ファイルはアップロードから24時間後に削除されます。
curl -o result.docx "https://files.convertfly.io/d/..."ジョブ
ジョブは、変換パイプラインを構成する1つ以上のタスクをまとめる入れ物です。ジョブ内のタスクは依存関係の順に実行され、各タスクはinputフィールドで前のタスクの出力を参照できます。
パイプラインの考え方
一般的なパイプラインはimport/url -> convert -> export/urlのようになります。複数の操作をつなげることもできます:import -> convert -> optimize -> watermark -> export。
ジョブのステータス
| ステータス | 説明 |
|---|---|
| waiting | ジョブが作成され、処理待ちのキューに入っています |
| processing | 少なくとも1つのタスクが実行中です |
| finished | すべてのタスクが正常に完了しました |
| error | 1つ以上のタスクが失敗しました |
ジョブを作成する
/api/v1/jobstagstringジョブを整理するための任意のラベル(例:batch-2026-04)。
tasksobject必須タスク名とタスク定義の対応表。タスク名はジョブ内で一意である必要があります。
webhook_urlstringジョブの完了時にjob.finishedまたはjob.failedイベントを受け取るURL。
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tag": "invoice-batch",
"tasks": {
"import-file": {
"operation": "import/url",
"url": "https://example.com/invoice.pdf"
},
"to-png": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": { "density": 300 }
},
"export": {
"operation": "export/url",
"input": ["to-png"]
}
}
}'{
"id": "cmxr9k2p0",
"tag": "invoice-batch",
"status": "processing",
"created_at": "2026-04-03T10:30:00Z",
"tasks": [
{ "name": "import-file", "operation": "import/url", "status": "finished" },
{ "name": "to-png", "operation": "convert", "status": "processing" },
{ "name": "export", "operation": "export/url", "status": "waiting" }
]
}例:複数のファイルを1つのPDFに結合する
merge操作は、2つ以上の入力(PDFや画像)を1つのPDFにまとめます。input配列に、入力タスクの名前を順番に指定してください。
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"cover": {
"operation": "import/url",
"url": "https://example.com/cover.png"
},
"report": {
"operation": "import/url",
"url": "https://example.com/report.pdf"
},
"merge-all": {
"operation": "merge",
"input": ["cover", "report"]
},
"export": {
"operation": "export/url",
"input": ["merge-all"]
}
}
}'例:Webサイトをキャプチャする
capture-website操作には入力タスクは不要です。公開URLをPDF、PNG、JPGとして出力します。
curl -X POST https://convertfly.io/api/v1/jobs \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"tasks": {
"capture": {
"operation": "capture-website",
"url": "https://example.com",
"output_format": "pdf",
"width": 1280
},
"export": {
"operation": "export/url",
"input": ["capture"]
}
}
}'ジョブを取得する
/api/v1/jobs/:idジョブの詳細と、そのすべてのタスクのステータスを取得します。
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."ジョブの一覧を取得する
/api/v1/jobspageintegerページ番号(1から開始)。デフォルト:1。
limitinteger1ページあたりの件数(1~100)。デフォルト:20。
statusstringステータスで絞り込みます:WAITING、PROCESSING、FINISHED、ERROR。
tagstringタグで絞り込みます。
curl "https://convertfly.io/api/v1/jobs?status=finished&per_page=5" \
-H "Authorization: Bearer cvfly_sk_..."{
"data": [ ... ],
"links": { "first": "?page=1&per_page=5", "last": "?page=9&per_page=5", "prev": null, "next": "?page=2&per_page=5" },
"meta": {
"page": 1,
"per_page": 5,
"total": 42
}
}ジョブを削除する
/api/v1/jobs/:idジョブと、それに関連するすべてのファイルを削除します。実行中のタスクはキャンセルされます。この操作は元に戻せません。
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
-H "Authorization: Bearer cvfly_sk_..."完了を待つ
/api/v1/jobs/:id/waitジョブが終了状態(FINISHEDまたはERROR)になるまで待機するロングポーリング用のエンドポイントです。300秒経ってもジョブが処理中の場合は、202 Acceptedを返してタイムアウトします。
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
-H "Authorization: Bearer cvfly_sk_..."タスク
タスクはジョブ内の個々の処理ステップです。各タスクには名前(tasksオブジェクトのキー)とoperationがあり、必要に応じて前のタスク名を参照するinput配列を指定します。
タスクのフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| operation | string | 実行する操作(操作一覧を参照) |
| input | string[] | 出力を入力として使用するタスクの名前 |
| output_format | string | 変換操作の出力形式 |
| options | object | 操作ごとの設定(品質、解像度など) |
ジョブのタスク一覧を取得する
/api/v1/jobs/:id/tasks{
"data": [
{
"name": "import-file",
"operation": "import/url",
"status": "finished",
"result": { "file_id": "file_Xk9m..." }
},
{
"name": "convert",
"operation": "convert",
"status": "finished",
"result": { "file_id": "file_Pm3n..." }
}
]
}タスクを取得する
/api/v1/jobs/:job_id/tasks/:task_nameタスクをキャンセルする
/api/v1/jobs/:job_id/tasks/:task_name/cancel実行中または待機中のタスクをキャンセルします。そのタスクに依存する後続のタスクもキャンセルされます。
失敗したタスクを再試行する
/api/v1/jobs/:job_id/tasks/:task_name/retryステータスがERRORのタスクを再試行します。課金対象のタスクの場合、クレジットが再度消費されます。
ファイルのアップロード
ConvertFlyにファイルを渡す方法は3つあります。用途に最も合った方法を選んでください。
URLからインポート
最も簡単な方法です。ConvertFlyが公開URLからファイルをダウンロードします。
{
"import-file": {
"operation": "import/url",
"url": "https://example.com/document.pdf",
"filename": "document.pdf",
"headers": {
"Authorization": "Bearer your-external-token"
}
}
}直接アップロード(署名付きURL)
お使いのコンピューター上のファイル向けです。2段階の手順で行います。まずタスクを作成して署名付きのアップロードURLを取得し、次にそのURLへファイルをPUTします。
{
"upload-file": {
"operation": "import/upload",
"filename": "photo.jpg"
}
}# The task result will contain the presigned URL
curl -X PUT "https://files.convertfly.io/convertfly-files/..." \
-H "Content-Type: image/jpeg" \
--data-binary @photo.jpgBase64からインポート
小さなファイル(10 MB未満)向けです。ファイルの内容をリクエストに直接埋め込みます。
{
"import-file": {
"operation": "import/base64",
"file": "JVBERi0xLjQKJcOkw7zD...",
"filename": "document.pdf"
}
}| 方法 | 最大サイズ | 適した用途 |
|---|---|---|
| import/url | 5 GB | すでにオンラインにあるファイル |
| import/upload | 5 GB | ローカルのファイル、大きなファイル |
| import/base64 | 10 MB | 小さなファイル、リクエストに直接埋め込み |
変換オプション
操作ごとに固有のオプションがあります。利用できるすべての操作と、変換できる形式の組み合わせを以下に示します。
利用できる操作
| 操作 | 説明 | クレジット |
|---|---|---|
| import/upload | 署名付きURLでファイルをアップロード | 0 |
| import/url | URLからファイルをインポート | 0 |
| import/base64 | Base64データからファイルをインポート | 0 |
| convert | 形式を変換 | 1-4 |
| optimize | ファイルを圧縮・最適化 | 1 |
| thumbnail | サムネイルのプレビューを生成 | 1 |
| merge | 複数のPDFや画像を1つのPDFに結合 | 1 |
| watermark | 画像、動画、PDFにテキストまたは画像の透かしを追加 | 1 |
| split | PDFからページを抽出、または1ページごとのPDFに分割(ZIP) | 1 |
| rotate | PDFのページを90度、180度、270度回転 | 1 |
| resize | 縦横比を保ったまま、幅、高さ、またはパーセントで画像をリサイズ | 1 |
| gif | 動画のクリップをアニメーションGIFに変換(開始位置、長さ、fps、幅) | 2 |
| ocr | PDFや画像内のテキストを認識(14言語、OCRページと同じ) | 3 |
| capture-website | 公開WebサイトをPDF、PNG、JPGでキャプチャ | 1 |
| metadata | ファイルのメタデータを抽出 | 1 |
| export/url | 署名付きのダウンロードURLを取得 | 0 |
| export/s3 | お客様のS3バケットに直接エクスポート | 0 |
対応する形式の組み合わせ
よく使われる変換です。形式はファイルから自動的に判別されますが、input_formatで明示的に指定することもできます。
| カテゴリ | 入力形式 | 出力形式 |
|---|---|---|
| 文書 | pdf, docx, doc, odt, rtf, txt, html | pdf, docx, odt, rtf, txt, html |
| 表計算 | xlsx, xls, ods, csv | xlsx, ods, csv, pdf |
| プレゼンテーション | pptx, ppt, odp | pptx, odp, pdf |
| 画像 | jpg, png, gif, bmp, tiff, webp, svg, heic | jpg, png, gif, bmp, tiff, webp |
| 動画 | mp4, avi, mov, mkv, webm | mp4, avi, mov, mkv, webm, gif |
| 音声 | mp3, wav, ogg, flac, aac, m4a | mp3, wav, ogg, flac, aac |
品質と処理のオプション
変換タスクのoptionsオブジェクトで指定します。
qualityinteger非可逆形式の出力品質(1~100)。デフォルト:85。
densityinteger文書から画像への変換時のDPI。デフォルト:150。
widthinteger指定した幅(ピクセル)にリサイズします。heightを省略すると縦横比を保ちます。
heightinteger指定した高さ(ピクセル)にリサイズします。widthを省略すると縦横比を保ちます。
pagesstring文書操作のページ範囲。例:1-5、1,3,5、all。
{
"convert-hq": {
"operation": "convert",
"input": ["import-file"],
"output_format": "png",
"options": {
"density": 300,
"quality": 95
}
}
}Webhook
WebhookのURLを登録すると、ジョブやタスクのステータスが変わったときにリアルタイムで通知を受け取れます。すべてのペイロードはHMAC-SHA256で署名されているため、ConvertFlyから送信されたものであることを確認できます。
Webhookを作成する
/api/v1/webhooksurlstring必須Webhookイベントを受け取るHTTPSのURL。
eventsstring[]必須購読するイベントの種類。
curl -X POST https://convertfly.io/api/v1/webhooks \
-H "Authorization: Bearer cvfly_sk_..." \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"]
}'{
"data": {
"id": "wh_Abc123...",
"url": "https://your-app.com/webhooks/convertfly",
"events": ["job.finished", "job.failed"],
"signing_secret": "whsec_9f8e7d6c5b4a...",
"created_at": "2026-04-03T10:30:00Z"
}
}Webhookの一覧を取得する
/api/v1/webhooksWebhookを削除する
/api/v1/webhooks/:idイベントの種類
| イベント | 発生条件 |
|---|---|
| job.finished | ジョブ内のすべてのタスクが正常に完了した |
| job.failed | 1つ以上のタスクが失敗し、ジョブがERROR状態になった |
| task.finished | 個々のタスクが完了した |
| task.failed | 個々のタスクが失敗した |
Webhookのペイロード
{
"event": "job.finished",
"timestamp": "2026-04-03T10:31:15Z",
"data": {
"id": "job_7kX9mP2qR",
"status": "finished",
"tasks": { ... }
}
}署名の検証
各Webhookリクエストには、X-Webhook-SignatureとX-Webhook-Timestampの2つのヘッダーが含まれます。これらを検証して、ペイロードがConvertFlyから送信され、改ざんされていないことを確認してください。
import crypto from "crypto";
function verifyWebhook(rawBody, signature, timestamp, secret) {
const signedContent = timestamp + "." + rawBody;
const expected = "v1=" + crypto
.createHmac("sha256", secret)
.update(signedContent)
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}import hmac, hashlib
def verify_webhook(raw_body: bytes, signature: str, timestamp: str, secret: str) -> bool:
signed_content = f"{timestamp}.{raw_body.decode()}"
expected = "v1=" + hmac.new(
secret.encode(), signed_content.encode(), hashlib.sha256
).hexdigest()
return hmac.compare_digest(expected, signature)APIキー
APIキーをプログラムから管理できます。ダッシュボードからキーを管理することもできます。
APIキーを作成する
/api/v1/api-keysnamestring必須キーの内容がわかる名前。
scopesstring[]付与する権限。デフォルト:["*"](フルアクセス)。
{
"data": {
"id": "key_Xk9m...",
"name": "production-server",
"key": "cvfly_sk_live_abc123def456...",
"scopes": ["*"],
"created_at": "2026-04-03T10:30:00Z"
}
}重要:APIキーの全体が表示されるのは作成時の1回だけです。安全な場所に保存してください。後から再取得することはできません。
APIキーの一覧を取得する
/api/v1/api-keysAPIキーを無効化する
/api/v1/api-keys/:idキーを直ちに無効にします。そのキーを使ったリクエストには401が返されます。
レート制限
公平な利用を確保するため、APIリクエストにはAPIキーごとにレート制限が適用されます。上限を超えると、リクエストには429 Too Many Requestsが返されます。
標準の上限
各APIキーで1時間あたり100リクエストまで利用できます。キーの一覧を取得すると、そのキーの現在の上限と時間枠がrate_limitとrate_limit_window(秒)として返されます。より高い上限が必要な場合は、お問い合わせください。
レスポンスヘッダー
APIキーを使ったリクエストへのすべてのレスポンスには、以下のヘッダーが含まれます。
X-RateLimit-Limitヘッダー現在の時間枠で許可される最大リクエスト数。
X-RateLimit-Remainingヘッダー現在の時間枠で残っているリクエスト数。
X-RateLimit-Resetヘッダー時間枠がリセットされるUnixタイムスタンプ。
Retry-Afterヘッダー再試行までに待つ秒数(429レスポンスの場合のみ)。
HTTP/1.1 429 Too Many Requests
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1743681600
Retry-After: 3600
{
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. 100 requests per 3600s allowed."
}エラー
ConvertFlyは一般的なHTTPステータスコードを使用します。すべてのエラーレスポンスは、機械で読み取れるcodeと人が読めるmessageを含む、一貫した形式に従います。
エラーレスポンスの形式
{
"code": "INVALID_DATA",
"message": "Missing required field: output_format",
"details": {
"field": "output_format",
"reason": "required"
}
}エラーコード
| コード | HTTP | 説明 |
|---|---|---|
| INVALID_DATA | 400 | リクエストの本文またはパラメーターが無効です |
| UNAUTHENTICATED | 401 | APIキーがないか、無効です |
| FORBIDDEN | 403 | APIキーに、この操作に必要なスコープがありません |
| NOT_FOUND | 404 | リソースが存在しないか、削除されています |
| CONFLICT | 409 | リソースがすでに存在するか、操作が現在の状態と競合しています |
| PAYLOAD_TOO_LARGE | 413 | リクエストの本文が許可される最大サイズを超えています |
| UNSUPPORTED_FORMAT | 422 | 要求された変換には対応していません |
| RATE_LIMIT_EXCEEDED | 429 | レート制限を超えました。レート制限をご覧ください |
| INSUFFICIENT_CREDITS | 402 | 操作を完了するのに十分なクレジットがありません |
| SERVER_ERROR | 500 | 内部サーバーエラーです。再試行するか、サポートにお問い合わせください |
| UNAVAILABLE | 503 | サービスが一時的に利用できません。しばらくしてからもう一度お試しください |
エラーの処理
const res = await fetch("https://convertfly.io/api/v1/jobs", {
method: "POST",
headers: {
"Authorization": "Bearer cvfly_sk_...",
"Content-Type": "application/json",
},
body: JSON.stringify({ tasks: { /* ... */ } }),
});
if (!res.ok) {
const error = await res.json();
console.error(`[${error.code}] ${error.message}`);
// "[INVALID_DATA] Missing required field: output_format"
return;
}
const { data: job } = await res.json();クレジット
操作ごとに一定数のクレジットを消費します。インポートとエクスポートの操作は無料です。残高は、すべてのAPIレスポンスのX-Credits-Remainingヘッダーに含まれます。
変換の種類ごとのクレジット消費量
| 操作 | 消費量 | 例 |
|---|---|---|
| インポート/エクスポート | 無料 | import/url, import/upload, export/url, export/s3 |
| 画像の変換 | 1クレジット | jpgからpng、webpからgif、heicからjpg |
| 音声の変換 | 1クレジット | mp3からwav、flacからaac |
| 文書からPDF | 1クレジット | txtからpdf、htmlからpdf、mdからpdf |
| OfficeからPDF | 2クレジット | docxからpdf、pptxからpdf、xlsxからpdf |
| 動画の変換 | 2クレジット | mp4からwebm、movからmp4 |
| PDFからOffice | 4クレジット | pdfからdocx、pdfからpptx |
| 最適化 | 1クレジット | 画像やPDFを圧縮 |
| サムネイル | 1クレジット | プレビュー画像を生成 |
| 結合 | 1クレジット | 複数のPDFを結合 |
| 透かし | 1クレジット | テキストや画像を重ねる |
| PDF分割 | 1クレジット | 1-3, 7 ページを抽出、または1ページごとに1ファイル |
| PDF回転 | 1クレジット | すべてのページまたは一部のページを回転 |
| 画像リサイズ | 1クレジット | 幅1200 px、50パーセント |
| GIF作成 | 2クレジット | mp4のクリップをgifに、料金は動画変換と同じ |
| Webサイトのキャプチャ | 1クレジット | URLをPDFまたは画像として出力 |
| OCR | 3クレジット | スキャンしたPDFを検索可能にする |
| メタデータ | 1クレジット | ファイル情報を抽出 |
残高の確認
すべてのAPIレスポンスには、現在の残高を示すX-Credits-Remainingヘッダーが含まれます。
HTTP/1.1 201 Created
Content-Type: application/json
X-Credits-Remaining: 9847
X-Credits-Used: 2残高が不足してジョブを完了できない場合、APIはINSUFFICIENT_CREDITSエラーコードとともに402を返します。ダッシュボードの「請求」ページでクレジットを追加してください。
サンドボックス
サンドボックスキーを使うと、クレジットを消費せずに連携機能を一通り構築・テストできます。"sandbox": trueを指定してキーを作成すると、接頭辞がcvfly_sk_ではなくcf_test_になります。本番環境とまったく同じように動作しますが、違いが3つあります。
| クレジット | 一切消費されません。残高は変わりません。 |
| ファイルサイズ | 入力ファイルの上限は5 MBです。 |
| 出力 | 画像、動画、PDFには「ConvertFly SANDBOX」の透かしが入ります。 |
curl -X POST https://convertfly.io/api/v1/api-keys \
-H "Authorization: Bearer YOUR_LIVE_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Sandbox", "sandbox": true}'
# Response includes: "key": "cf_test_...", "is_sandbox": true