API ドキュメント

プログラムによるエンコード — Ultra サブスクライバー限定アカウント → API キーでキーを作成し、キーをそのまま下記エンドポイント URL に含めてください。

プラン上限

プラン1 ファイル上限API アクセスmultipart 必須?
Free 5 KB
Pro 100 MB 不要(単発 PUT で OK)
Ultra 300 MB あり ファイル >100 MB は multipart 必須

Cloudflare エッジは 1 リクエスト body を 100 MB に制限します。それを超えるファイルは 50 MB の part に分割し、下記の multipart エンドポイントを使ってください。

単発 PUT アップロード(≤100 MB)

POST https://webhook.binaryphp.com/upload/<api_key>
  X-BPHP-Filename: plugin.php          # 必須、拡張子は .php または .zip
  X-BPHP-Domain:   app.example.com,*.example.com
  X-BPHP-Mac:      aa:bb:cc:dd:ee:ff   # 任意
  X-BPHP-Expire:   2027-12-31          # 任意
  X-BPHP-Webhook:  https://you.example.com/wh    # 任意、非同期通知用
  <ファイルバイナリを request body として>

→ 200 {
    "job_id":       "...",
    "download_url": "https://...presigned R2 URL...",
    "expires_at":   "2026-05-09T...",
    "size":         12345,
    "license":      { "domains": [...], ... }
  }

curl 1 行版:

curl -X POST https://webhook.binaryphp.com/upload/$API_KEY \
  -H "X-BPHP-Filename: plugin.php" \
  -H "X-BPHP-Domain: app.example.com" \
  --data-binary @plugin.php

Multipart アップロード(任意サイズ、>100 MB は必須)

3 ステップ: init → 各 part を個別に PUT → complete

1. Init(初期化)

POST https://webhook.binaryphp.com/upload/<api_key>/init
  X-BPHP-Filename:   bigplugin.zip
  X-BPHP-Total-Size: 200000000

→ 200 {
    "job_id":     "...",
    "upload_id":  "...",                         # R2 multipart 不透明 id
    "r2_key":     "uploads/<job_id>.zip",
    "part_size":  52428800,                      # 推奨 50 MB / part
    "part_count": 4,
    "max_part_size": 104857600,                  # 100 MB ハードリミット
    "parts": [
      { "part_no": 1, "upload_url": "https://...presigned PUT..." },
      { "part_no": 2, "upload_url": "..." },
      { "part_no": 3, "upload_url": "..." },
      { "part_no": 4, "upload_url": "..." }
    ]
  }

2. 各 upload_url に PUT

これらの presigned URL は 直接 R2 へアクセスし、Worker 帯域を消費しません。 各 PUT 応答の ETag ヘッダは収集しておき、complete 段階でまとめて送信してください:

PUT <upload_url>
  <ファイルの (part_no-1)*part_size オフセットから part_size バイトを読む>

← 200 OK
  ETag: "abc123def456..."

各 part は ≥5 MB(最後の part のみ小さくて OK)、かつ ≤100 MB。

3. Complete(完了)

POST https://webhook.binaryphp.com/upload/<api_key>/complete
Content-Type: application/json

{
  "upload_id": "...",
  "r2_key":    "uploads/<job_id>.zip",
  "filename":  "bigplugin.zip",
  "parts": [
    { "part_no": 1, "etag": "\"abc...\"" },
    { "part_no": 2, "etag": "\"def...\"" },
    { "part_no": 3, "etag": "\"ghi...\"" },
    { "part_no": 4, "etag": "\"jkl...\"" }
  ],
  "domain":   "app.example.com",
  "mac":      "",
  "expire":   "2027-12-31",
  "plugin":   "",
  "webhook":  ""
}

→ 200 { "job_id", "download_url", "expires_at", "size", "license" }

Abort(任意)

途中で part アップロードに失敗した場合、/upload/<api_key>/abort{ upload_id, r2_key } 付きで呼び出し、残った part が R2 で課金され続けるのを防いでください。

Webhook 通知

X-BPHP-Webhook(または complete body の "webhook")を 設定すると encode.completed イベントを受信できます。通知は Cloudflare エッジ IP から送信され、 弊社のホスト IP は漏洩しません。Body はあなたの API key を共有秘密鍵として HMAC-SHA256 署名されます:

POST <あなたの webhook URL>
  X-BinaryPHP-Signature: t=1736208000,v1=<hex>
  X-BinaryPHP-Event:     encode.completed
  Content-Type:          application/json

{
  "event":        "encode.completed",
  "job_id":       "...",
  "download_url": "...",
  "expires_at":   "...",
  "size":         12345,
  "license":      { ... }
}

検証例(PHP):

$sig_h = $_SERVER['HTTP_X_BINARYPHP_SIGNATURE'] ?? '';
[$tpart, $vpart] = array_pad(explode(',', $sig_h, 2), 2, '');
$ts  = (int) substr($tpart, 2);
$got = substr($vpart, 3);
if (abs(time() - $ts) > 300) http_response_code(401);
$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', "$ts.$body", $YOUR_API_KEY);
if (!hash_equals($expected, $got)) http_response_code(401);

すぐ使えるクライアント

よくあるエラー

ステータスコード意味対処方法
401キーが誤っているか失効済み 「アカウント → API キー」で再作成
402プランがこの操作を非対応(例: Free で zip アップロード) プランをアップグレード
413ファイル / Content-Length がプラン上限超過 multipart に切替、または Pro→Ultra にアップグレード(300 MB)
400フィールド欠落またはフォーマットエラー(filename、parts 等) 応答 body を確認、欠けているフィールドが示されます
502R2 multipart 操作失敗 init を再試行;R2 は <1% の確率で失敗することがあります