APIリファレンス

ConvertFly REST APIを使うと、プログラムからファイルを変換、最適化、加工できます。ジョブとタスクで変換パイプラインを構築し、ファイルのインポート、処理、結果のエクスポートを1回のリクエストで行えます。

ベースURLhttps://convertfly.io/api/v1

すべてのエンドポイントは、このベースURLからの相対パスです。リクエストとレスポンスにはJSONを使用します。タイムスタンプはすべてUTCのISO 8601形式です。

認証

すべてのリクエストには、AuthorizationヘッダーにAPIキーを含める必要があります。キーにはcvfly_sk_という接頭辞が付いており、ダッシュボードで作成できます。

HTTPヘッダー
Authorization: Bearer cvfly_sk_live_abc123def456...

セキュリティのヒント:APIキーをクライアント側のコードに含めないでください。環境変数に保存し、サーバーからAPIを呼び出してください。

キーのスコープ

APIキーは一部の操作に限定できます。スコープを指定せずに作成したキーには、デフォルトのスコープが付与されます。

スコープアクセス
job:readジョブの読み取り(デフォルト)
job:writeジョブとそのタスクの作成、キャンセル、再試行、削除(デフォルト)
task:readタスクの読み取り(デフォルト)
convert変換の実行(デフォルト)
api-key:readAPIキーの一覧表示
api-key:writeAPIキーの作成と取り消し
webhook:readWebhookの一覧表示
webhook:writeWebhookの作成と削除

クイックスタート

PDFをDOCXに変換する手順は3つです。ジョブを作成し、完了を待ち、結果をダウンロードします。

1

変換ジョブを作成する

curl
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"]
      }
    }
  }'
JavaScript
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"
Python
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"
2

完了を待つ

ジョブのステータスをポーリングするか、Webhookを使ってリアルタイムで通知を受け取ります。

curl
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=..." }
        ]
      }
    }
  ]
}
3

結果をダウンロードする

エクスポートタスクの結果に含まれるURLを使用します。ダウンロードリンクの有効期限は1時間で、ファイルはアップロードから24時間後に削除されます。

curl
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すべてのタスクが正常に完了しました
error1つ以上のタスクが失敗しました

ジョブを作成する

POST/api/v1/jobs
tagstring

ジョブを整理するための任意のラベル(例:batch-2026-04)。

tasksobject必須

タスク名とタスク定義の対応表。タスク名はジョブ内で一意である必要があります。

webhook_urlstring

ジョブの完了時にjob.finishedまたはjob.failedイベントを受け取るURL。

curl
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"]
      }
    }
  }'
レスポンス(201 Created)
{
  "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
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
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"]
      }
    }
  }'

ジョブを取得する

GET/api/v1/jobs/:id

ジョブの詳細と、そのすべてのタスクのステータスを取得します。

curl
curl https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
  -H "Authorization: Bearer cvfly_sk_..."

ジョブの一覧を取得する

GET/api/v1/jobs
pageinteger

ページ番号(1から開始)。デフォルト:1。

limitinteger

1ページあたりの件数(1~100)。デフォルト:20。

statusstring

ステータスで絞り込みます:WAITING、PROCESSING、FINISHED、ERROR。

tagstring

タグで絞り込みます。

curl
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
  }
}

ジョブを削除する

DELETE/api/v1/jobs/:id

ジョブと、それに関連するすべてのファイルを削除します。実行中のタスクはキャンセルされます。この操作は元に戻せません。

curl
curl -X DELETE https://convertfly.io/api/v1/jobs/job_7kX9mP2qR \
  -H "Authorization: Bearer cvfly_sk_..."

完了を待つ

GET/api/v1/jobs/:id/wait

ジョブが終了状態(FINISHEDまたはERROR)になるまで待機するロングポーリング用のエンドポイントです。300秒経ってもジョブが処理中の場合は、202 Acceptedを返してタイムアウトします。

curl
curl "https://convertfly.io/api/v1/jobs/job_7kX9mP2qR/wait?timeout=120" \
  -H "Authorization: Bearer cvfly_sk_..."

タスク

タスクはジョブ内の個々の処理ステップです。各タスクには名前(tasksオブジェクトのキー)とoperationがあり、必要に応じて前のタスク名を参照するinput配列を指定します。

タスクのフィールド

フィールド型説明
operationstring実行する操作(操作一覧を参照)
inputstring[]出力を入力として使用するタスクの名前
output_formatstring変換操作の出力形式
optionsobject操作ごとの設定(品質、解像度など)

ジョブのタスク一覧を取得する

GET/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..." }
    }
  ]
}

タスクを取得する

GET/api/v1/jobs/:job_id/tasks/:task_name

タスクをキャンセルする

POST/api/v1/jobs/:job_id/tasks/:task_name/cancel

実行中または待機中のタスクをキャンセルします。そのタスクに依存する後続のタスクもキャンセルされます。

失敗したタスクを再試行する

POST/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します。

ステップ1:import/uploadを含むジョブを作成する
{
  "upload-file": {
    "operation": "import/upload",
    "filename": "photo.jpg"
  }
}
ステップ2:署名付きURLにアップロードする
# 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.jpg

Base64からインポート

小さなファイル(10 MB未満)向けです。ファイルの内容をリクエストに直接埋め込みます。

タスクの定義
{
  "import-file": {
    "operation": "import/base64",
    "file": "JVBERi0xLjQKJcOkw7zD...",
    "filename": "document.pdf"
  }
}
方法最大サイズ適した用途
import/url5 GBすでにオンラインにあるファイル
import/upload5 GBローカルのファイル、大きなファイル
import/base6410 MB小さなファイル、リクエストに直接埋め込み

変換オプション

操作ごとに固有のオプションがあります。利用できるすべての操作と、変換できる形式の組み合わせを以下に示します。

利用できる操作

操作説明クレジット
import/upload署名付きURLでファイルをアップロード0
import/urlURLからファイルをインポート0
import/base64Base64データからファイルをインポート0
convert形式を変換1-4
optimizeファイルを圧縮・最適化1
thumbnailサムネイルのプレビューを生成1
merge複数のPDFや画像を1つのPDFに結合1
watermark画像、動画、PDFにテキストまたは画像の透かしを追加1
splitPDFからページを抽出、または1ページごとのPDFに分割(ZIP)1
rotatePDFのページを90度、180度、270度回転1
resize縦横比を保ったまま、幅、高さ、またはパーセントで画像をリサイズ1
gif動画のクリップをアニメーションGIFに変換(開始位置、長さ、fps、幅)2
ocrPDFや画像内のテキストを認識(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, htmlpdf, docx, odt, rtf, txt, html
表計算xlsx, xls, ods, csvxlsx, ods, csv, pdf
プレゼンテーションpptx, ppt, odppptx, odp, pdf
画像jpg, png, gif, bmp, tiff, webp, svg, heicjpg, png, gif, bmp, tiff, webp
動画mp4, avi, mov, mkv, webmmp4, avi, mov, mkv, webm, gif
音声mp3, wav, ogg, flac, aac, m4amp3, wav, ogg, flac, aac

品質と処理のオプション

変換タスクのoptionsオブジェクトで指定します。

qualityinteger

非可逆形式の出力品質(1~100)。デフォルト:85。

densityinteger

文書から画像への変換時のDPI。デフォルト:150。

widthinteger

指定した幅(ピクセル)にリサイズします。heightを省略すると縦横比を保ちます。

heightinteger

指定した高さ(ピクセル)にリサイズします。widthを省略すると縦横比を保ちます。

pagesstring

文書操作のページ範囲。例:1-5、1,3,5、all。

例:300 DPIの高品質PNG
{
  "convert-hq": {
    "operation": "convert",
    "input": ["import-file"],
    "output_format": "png",
    "options": {
      "density": 300,
      "quality": 95
    }
  }
}

Webhook

WebhookのURLを登録すると、ジョブやタスクのステータスが変わったときにリアルタイムで通知を受け取れます。すべてのペイロードはHMAC-SHA256で署名されているため、ConvertFlyから送信されたものであることを確認できます。

Webhookを作成する

POST/api/v1/webhooks
urlstring必須

Webhookイベントを受け取るHTTPSのURL。

eventsstring[]必須

購読するイベントの種類。

curl
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"]
  }'
レスポンス(201 Created)
{
  "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の一覧を取得する

GET/api/v1/webhooks

Webhookを削除する

DELETE/api/v1/webhooks/:id

イベントの種類

イベント発生条件
job.finishedジョブ内のすべてのタスクが正常に完了した
job.failed1つ以上のタスクが失敗し、ジョブがERROR状態になった
task.finished個々のタスクが完了した
task.failed個々のタスクが失敗した

Webhookのペイロード

WebhookのURLへのPOST
{
  "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から送信され、改ざんされていないことを確認してください。

Node.js
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)
  );
}
Python
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キーを作成する

POST/api/v1/api-keys
namestring必須

キーの内容がわかる名前。

scopesstring[]

付与する権限。デフォルト:["*"](フルアクセス)。

レスポンス(201 Created)
{
  "data": {
    "id": "key_Xk9m...",
    "name": "production-server",
    "key": "cvfly_sk_live_abc123def456...",
    "scopes": ["*"],
    "created_at": "2026-04-03T10:30:00Z"
  }
}

重要:APIキーの全体が表示されるのは作成時の1回だけです。安全な場所に保存してください。後から再取得することはできません。

APIキーの一覧を取得する

GET/api/v1/api-keys

APIキーを無効化する

DELETE/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レスポンスの場合のみ)。

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を含む、一貫した形式に従います。

エラーレスポンスの形式

JSON
{
  "code": "INVALID_DATA",
  "message": "Missing required field: output_format",
  "details": {
    "field": "output_format",
    "reason": "required"
  }
}

エラーコード

コードHTTP説明
INVALID_DATA400リクエストの本文またはパラメーターが無効です
UNAUTHENTICATED401APIキーがないか、無効です
FORBIDDEN403APIキーに、この操作に必要なスコープがありません
NOT_FOUND404リソースが存在しないか、削除されています
CONFLICT409リソースがすでに存在するか、操作が現在の状態と競合しています
PAYLOAD_TOO_LARGE413リクエストの本文が許可される最大サイズを超えています
UNSUPPORTED_FORMAT422要求された変換には対応していません
RATE_LIMIT_EXCEEDED429レート制限を超えました。レート制限をご覧ください
INSUFFICIENT_CREDITS402操作を完了するのに十分なクレジットがありません
SERVER_ERROR500内部サーバーエラーです。再試行するか、サポートにお問い合わせください
UNAVAILABLE503サービスが一時的に利用できません。しばらくしてからもう一度お試しください

エラーの処理

JavaScript
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
文書からPDF1クレジットtxtからpdf、htmlからpdf、mdからpdf
OfficeからPDF2クレジットdocxからpdf、pptxからpdf、xlsxからpdf
動画の変換2クレジットmp4からwebm、movからmp4
PDFからOffice4クレジット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または画像として出力
OCR3クレジットスキャンした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

開発を始める準備はできましたか?

無料アカウントを作成し、サンドボックスキーで無料でAPIをテストできます。

お客様のデータ

広告も広告ネットワークも使っていないため、拒否するものはありません。使用しているものは次のとおりです。

ファイル

暗号化して保存し、アップロードの 24 時間後に削除します。

必須 Cookie

常に有効
用途名前期間
言語の記憶NEXT_LOCALEブラウザを閉じるまで
無料枠のカウントcf_free1 年
ログインの維持authjs.*30 日(アカウントをお持ちの場合)

Dizzus がホストする Plausible を Cookie なしで使用しています。見ているのは合計値で、個人ではありません。

サービス提供者:決済は Stripe、DNS とボット対策は Cloudflare。 プライバシーポリシー